socket数据传输建立的过程详解

远程服务器启用socket()变量在建立了1个tcp协议以后,由于没有链接,这个tcp协议处于moved状态;当服务器程序启用listen()变量以后,tcp协议进入LISTEN状态,并开始监听远程服务器请求。

此时,服务端开始启动请求:

outputo-20211115-092639-121-shsg.png

1)当远程服务器启用connect()变量以后,TCP协议会转化成一个包,并设定SYN标志位,说明这个SYN标志位用于建立同步链接。还会产生1个随机数字1000,用“序列号(Seq)”字符串来表示这个包的序号。当这些工作完成后,开始将包发送到服务器程序,远程服务器进入SYN-SEND状态。

2)服务器程序收到会话层,监测到已设定了SYN标志位,知道这是服务端发出的链接建立“请求包”。服务端还将转化成一个包,并设定SYN和ACK标记位,SYN表示此包用于建立链接,ACK使用ACK来确认收到到来自远程服务器的会话层。

伺服器产生1个随机数字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是否成立,如果该用户正确收到到了自己的数据包。

分享: