TCP(Transmission Control Protocol,传输掌握协定)是一种面向衔接的、牢靠的、基于字撙节的通讯协定,数据在传输前要树立衔接,传输终了后还要断开衔接。
客户端在收发数据前要运用 connect() 函数和效劳器树立衔接。树立衔接的目标是包管IP地址、端口、物理链路等准确无误,为数据的传输开拓通道。
TCP树立衔接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以抽象的比方为下面的对话:
[Shake 1] 套接字A:“你好,套接字B,我这里无数据要传送给你,树立衔接吧。”
[Shake 2] 套接字B:“好的,我这边已预备停当。”
[Shake 3] 套接字A:“感谢你受理我的恳求。”
我们先来看一下TCP数据报的构造:
带暗影的几个字段需求重点阐明一下:
1) 序号:Seq(Sequence Number)序号占32位,用来标识从盘算机A发送到盘算机B的数据包的序号,盘算机发送数据时对此停止标志。
2) 确认号:Ack(Acknowledge Number)确认号占32位,客户端和效劳器端都可以发送,Ack = Seq + 1。
3) 标记位:每一个标记位占用1Bit,共有6个,辨别为 URG、ACK、PSH、RST、SYN、FIN,详细寄义如下:
URG:紧迫指针(urgent pointer)无效。
ACK:确认序号无效。
PSH:接纳方应当尽快将这个报文交给使用层。
RST:重置衔接。
SYN:树立一个新衔接。
FIN:断开一个衔接。
对英文字母缩写的总结:Seq 是 Sequence 的缩写,表现序列;Ack(ACK) 是 Acknowledge 的缩写,表现确认;SYN 是 Synchronous 的缩写,情愿是“同步的”,这里表现树立同步衔接;FIN 是 Finish 的缩写,表现完成。
运用 connect() 树立衔接时,客户端和效劳器端会互相发送三个数据包,请看下图:
客户端挪用 socket() 函数创立套接字后,由于没有树立衔接,所以套接字处于CLOSED形态;效劳器端挪用 listen() 函数后,套接字进入LISTEN形态,开端监听客户端恳求。
这个时分,客户端开端提议恳求:
1) 当客户端挪用 connect() 函数后,TCP协定会组建一个数据包,并设置 SYN 标记位,表现该数据包是用来树立同步衔接的。同时生成一个随机数字 1000,填充“序号(Seq)”字段,表现该数据包的序号。完成这些任务,开端向效劳器端发送数据包,客户端就进入了SYN-SEND形态。
2) 效劳器端收到数据包,检测到曾经设置了 SYN 标记位,就晓得这是客户端发来的树立衔接的“恳求包”。效劳器端也会组建一个数据包,并设置 SYN 和 ACK 标记位,SYN 表现该数据包用来树立衔接,ACK 用来确认收到了方才客户端发送的数据包。
效劳器生成一个随机数 2000,填充“序号(Seq)”字段。2000 和客户端数据包没有关系。
效劳器将客户端数据包序号(1000)加1,失掉1001,并用这个数字填充“确认号(Ack)”字段。
效劳器将数据包收回,进入SYN-RECV形态。
3) 客户端收到数据包,检测到曾经设置了 SYN 和 ACK 标记位,就晓得这是效劳器发来的“确认包”。客户端会检测“确认号(Ack)”字段,看它的值能否为 1000+1,假如是就阐明衔接树立胜利。
接下来,客户端会持续组建数据包,并设置 ACK 标记位,表现客户正直确接纳了效劳器发来的“确认包”。同时,将方才效劳器发来的数据包序号(2000)加1,失掉 2001,并用这个数字来填充“确认号(Ack)”字段。
客户端将数据包收回,进入ESTABLISED形态,表现衔接曾经胜利树立。
4) 效劳器端收到数据包,检测到曾经设置了 ACK 标记位,就晓得这是客户端发来的“确认包”。效劳器会检测“确认号(Ack)”字段,看它的值能否为 2000+1,假如是就阐明衔接树立胜利,效劳器进入ESTABLISED形态。
至此,客户端和效劳器都进入了ESTABLISED形态,衔接树立胜利,接下来就可以收发数据了。
三次握手的症结是要确认对方收到了本人的数据包,这个目的就是经过“确认号(Ack)”字段完成的。盘算时机记载下本人发送的数据包序号 Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1能否成立,假如成立阐明对朴直确收到了本人的数据包。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。