TCP的三次握手与四次挥手

TCP的几个状态:SYN,FIN,ACK,PSH,RST,URG
SYN(synchronous 建立联机)
ACK(acknowledgement 确认)
PSH(push 推送 表示有数据传输)
FIN(finish 结束)
RST(reset 重置)
URG(urgent 紧急)
Sequence number(序号)
Acknowledge number(确认号码)

三次握手:
第一次握手:主机A发送位码为syn = 1 ,随机产生 seq number = a (例如:a = 123456789) 的数据包 ,主机收到通过sqn=1明白主机A请求建立联机。
第二次握手:主机B收到请求后确认联机信息,向主机A发送ack number = (主机A的seql +1),sqn = 1,ack = 1,随机产生 seq number = b (例如b = 987654321)
第三次握手:主机A收到后检查 ack number 是否正确 (与 第一次发送的seq number 进行比对) 以及 ack是否为1,如果正确发送 ack number = (主机B 的 seq +1), ack = 1 主机B收到后确认seq 值与 ack 是否为 1 如果正确 则连接建立成功。

四次挥手:
第一次挥手: 主机A发送一个FIN(状态标记),用来关闭 主机A 到 主机B 的数据传送 主机A进行 FIN_WAIT_1状态
第二次挥手:主机B收到FIN后,发送一个ack给主机A,确认序号为ack = a + b ,主机B 进入 COLSE_WAIT状态
第三次挥手:主机B发送一个FIN ,用来关闭主机B到主机A之间的数据传送,主机B进入了LAST_ACK状态
第四次挥手:主机A收到FIN后,主机A进行TIME_WAIT状态,接着发送一个ack 给 主机B 确认序号为 b +1 ,主机B 进入COLSED状态,断开连接。

为什么建立连接为三次,而断开连接需要四次?

因为服务端的listen状态下的socket当收到SYN报文的建立连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

你可能感兴趣的:(TCP的三次握手与四次挥手)