TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

1、TCP头部的规范定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0                                        15|16                                       31
+------------------------------------------+------------------------------------------+
| 16位源端口号 | 16位目的端口号 |
+------------------------------------------+------------------------------------------+
| 32位序号/Sequence number (seq) |
+------------------------------------------+------------------------------------------+
| 32位确认号/Acknowledge number (ack) |
+------------------------------------------+------------------------------------------+
|4位头部信息|6位保留|URG|ACK|PSH|RST|SYN|FIN | 16位窗口大小 |
+------------------------------------------+------------------------------------------+
| 16位校验和 | 16位紧急指针 |
+------------------------------------------+------------------------------------------+
| 选项最多40字节 |
+------------------------------------------+------------------------------------------+

2、TCP的三次握手:

1
2
3
Client(SYN_SENT)      -->         SYN=1,seq=k              -->   Server(SYN_RCVD)
Client(ESTABLISHED) <-- SYN=1,ACK=1,ack=k+1,seq=m <-- Server(SYN_RCVD)
Client(ESTABLISHED) --> ACK=1,seq=m+1,seq=l --> Server(ESTABLISHED)

为什么需要三次握手:
能够避免server端资源的浪费。
1、当Client端发送连接请求并没有丢失,而是在某个网络接点上滞留了,以至于延迟到连接释放以后的某个节点才到达Server;
2、本来只是一个早已失效的报文段,Server端接收到之后误认为这是Client端的一个新的请求,于是发送了连接确认报文;
3、如果不采用”三次握手”,只要等Server发送确认,新的连接就已经建立了;
4、等待Client端发送数据,但是此时Client不会理睬Server端的确认,也不会向Server端发送数据;
5、但是Server端认为连接已经建立还在等着Client的数据,此时就会存在Server端资源的浪费;

3、TCP的四次挥手

1
2
3
4
Client(FIN_WAIT_1)      -->         FIN=1,seq=k              -->   Server(CLOSE_WAIT)
Client(FIN_WAIT_2) <-- ACK=1,ack=k+1,seq=m <-- Server(CLOSE_WAIT)
Client(FIN_WAIT_2) <-- FIN=1,seq=i <-- Server(LAST_ACK)
Client(TIME_WAIT/2MSL) --> ACK=1,ack=i+1,seq=l --> Server(CLOSE)

4、为什么需要四次挥手

首先TCP是一种面向连接的、可靠的、基于字节流的运输层通讯协议,TCP是全双工模式
建立连接时,通过SYN+ACK能够确定双方均在线即可正常收发报文;
由于双工模式,假设Client端没有需要发送的报文了,于是发送FIN报文,Server端收到后给出了ACK确认报文;
但是有可能Server端还存在需要发送的报文,这个时候就需要Server端发送一次FIN报文,让Client端来确认

5、为什么需要等待2MSL?

MSL:报文段最大生存时间,它是任何报文在丢弃前在网络内的最长时间。
第一点:保证TCP全双工能够正常可靠关闭;
第二点:保证这次连续的重复数据段从网络中消失;

6、参考博客

一文彻底搞懂 TCP三次握手、四次挥手过程及原理