TCP/IP三次握手与四次挥手总结
2016-10-24 17:24
441 查看
三次握手:
客户端A 服务端B1. A发出请求联机,SYN=1和seq number=i的SYN包给B,并进入SYN_SEND状态
2. B收到后确认联机信息 ,向A发送ACK包(ack=1,ack number=i+1)和一个SYN包(syn=1,seq number=k)给A ,此时B进入SYN_RECE状态
3. A收到B发来的SYN+ACK包,检查ack number是否是i+1和ack标志位是否是1,如果是则向服务端B发送确认包ACK(ack number=k+1,ack=1),此包发送完毕客户端和服务端都进入established状态,完成三次握手。
四次挥手:
1. A向B发送TCP包,用了关闭客户端到服务端的数据传送,将标志FIN=1,seq number=i,A进入FIN_WAIT1状态。2. B收到FIN后,发送一个ACK(ack=1,ack number=i+1)还有一个seq number=j 给A, B进入CLOSE_WAIT(因为服务器B向A发送的数据不一定也发完)状态,A收到回应ACK报文后进入FIN_WAIT2状态
3. 服务器B发送一个TCP包,用来关闭服务端到客户端的数据传送,标志位FIN=1,ACK=1,seq number=k,ack number= i+1,B进入LAST_ACK状态
4.A收到FIN后,A进入TIME_WAIT,接着发送一个ACK(ack=1ack number=k+1)和seq number=i+1给B,B收到后进入CLOSED状,A还要等待2倍的MSL时间进入Closed状态
MSL(Maximum Segment Lifetime)报文最长存活时间
为什么建立连接协议是三次握手,而关闭是四次握手呢?
因为服务端LISTEN状态下的SOCKET当收到SYN报文的建立请求后,可以把ACK和SYN放在一个报文里来发送,但是关闭连接的时候,当收到对方的FIN报文时,它只是表示对方没有数据可发了,但是你的数据未必全部发送给对方,所以未必会马上关闭SOCKET,所有可以先发个ACK报文给对方,等自己的数据全部发完给对方后,再发FIN报文来表示自己现在可以关闭连接了。所以ACK报文和FIN报文大多数是分开发的。为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
因为无法保证最后发送的ACK报文一定会被对方收到,也就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用是用来重发可能丢失的ACK报文。相关文章推荐
- 关于TCPIP的三次握手和四次挥手的总结
- TCP/IP三次握手、四次挥手总结
- TCP/IP三次握手、四次挥手总结
- TCP/IP三次握手与四次挥手
- TCP/IP的三次握手连接和四次挥手关闭
- 关于TCP/IP的三次握手和四次挥手解释
- (转载)TCP/IP的三次握手与四次挥手
- TCP/IP三次握手与四次挥手(转)
- TCP/IP的三次握手与四次挥手详解
- TCP三次握手及四次挥手总结
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- 关于TCP/IP的三次握手和四次挥手解释
- TCP/IP 三次握手、四次挥手原理
- 【linux之tcpip三次握手和四次挥手分析】
- TCP/IP三次握手 四次挥手
- TCP/IP 三次握手、四次挥手
- TCP/IP三次握手四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手