同步包内数据
SYN是一个标志位,syn=1 代表建立新的连接
sep是一个序号 会随机生成一个内容 占32位
Ack是确认序号,将收到的sep序号的值+1,当ACK标志位为ACK=1时确认序号才有效
三次握手(精简)
第一次:
从客户端调用connect开始,发送一个同步包给服务器,告诉服务器我要给你发消息了
第二次:
服务器发送确认包(同步包中的值+1)告诉客户端说可以,同时发送同步包告诉客户端我也要给你发消息了
第三次:
客户端发送确认包(服务器发的同步包的值+1)告诉服务器我准备好了,服务器收到确认包后三次握手结束,建立连接
三次握手(详解)
第一次:
从客户端调用connect开始,客户端发送一个同步包
给服务器,告诉服务器我要给你发消息了
同步包:SYN=1,sep=k
第二次:
服务器收到客户端的同步包
后,发现SYN=1,知道客户端是要建立新的连接,发送确认包告诉客户端我同意你的请求
确认包:将同步包内的sep的k值+1,确认序号Ack=k+1,将ACK=1使确认序号生效
并且告诉客户端我要给你发消息了(发送同步包)
同步包:SYN=1,sep=j
第三次:
1)客户端收到确认包
后,发现
确认序号Ack=k+1,并且ACK=1
得知服务器将我发给他的sep值+1了,并且ACK=1,同意了我的连接请求
2)收到同步包
后,发现SYN=1,知道服务器要和我建立连接了
同步包:SYN=1, sep=j
3)客户端发送确认包告诉服务器我知道了,服务器收到之后连接建立
确认包:Ack=j+1,ACK=1
四次挥手(精简)
msl:一个数据包在网络上的存活时间最多为1个msl,2分钟
FIN是一个标识符,FIN=1表示释放连接
第一次:
客户端调用close开始,发送同步包告诉服务器我不再给你发消息了
同步包:FIN=1, sep=k
第二次:
服务器发送确认包(同步包内值+1)告诉客户端我知道了
确认包:Ack=k+1,ACK=1
第三次:
服务器调用close,发送同步包告诉客户端我也不给你发消息了,此时服务器会等待1msl,若1msl后客户端无响应会再次发送请求
同步包:FIN=1,sep=w
第四次:
客户端发送确认包(服务器发送的同步包内的值+1)告诉服务器我知道了,此时会等待2msl,服务器收到之后连接断开
确认包:Ack=w+1,ACK=1
注:
①为什么四次挥手中第三次挥手和第四次挥手不能同时进行
因为第一次挥手时仅代表客户端不再发送消息,但还可以接收消息
服务器收到请求后recv解阻塞,既可以选择发送一些数据给客户端之后再调用close关闭发送功能,也可以马上调用close关闭发送功能,这是不确定的,所以要分开进行
②为什么要等待2msl:
1)2msl在客户端第四次挥手时启动,发送Ack回复可能因为网络原因1个msl后才到达服务器,也可能会丢失
2)服务器在第三次挥手时发送了断开请求,在1个msl后没有收到客户端的回复,会再次发送断开请求,这个请求可能因为网络原因需要1个msl才到达客户端,一发一收2次,所以需要等待2个msl
3)为了防止以上情况再次发生,客户端收到断开请求并回复后会刷新2msl时间,防止最后一个Ack服务器没有收到