一.TCP 报头格式
16位源端口地址 | 16位目的端口地址 | |||||||
32位序号 | ||||||||
32位确认号 | ||||||||
4位首部长度 | 6位保留 | URG | ACK | PSH | RST | SYN | FIN | 16位窗口大小 |
16位校检和 | 16位紧急指针 | |||||||
选项及填充 |
URG 紧急指针的值有效 1时,紧急指针字段生效
ACK 确认字段的值有效 为1时,确认字段的值生效
PSH 将数据推向前面
RST 连接必须复位
SYN 在连接时对序号进行同步
FIN 终止连接
二.TCP 连接三次握手
Seq+SYN
ACK+SYN+Seq
ACK+seq
1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3) 客户必须再次回应服务段一个ACK报文,
三.TCP 断开四次握手
FIN+seq
ACK
FIN+Seq
ACk
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1
四.TCP 状态
CLOSED 没有连接 tcp初始状态
LISTEN 表示socket处于监听状态
SYN-SENT 客户端请求连接SYN报文发送后,客户端变为该状态,等待服务端的ACK
SYN-RECV 客户端接收到服务端的SYN后变为该状态,之后发送ACK
ESTABLISHED 连接建立
FIN-WAIT-1 应用程序已请求关闭该链接,即客户端发送FIN之后变为该状态
FIN-WAIT-2 另一端已接受关闭该链接,即服务端在接收到客户端的FIN,发送ACK滞后的状态
CLOSING 两端都已经决定关闭连接,即双方都发送了FIN
TIME-WAIT表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSE-WAIT 即在接受了第一次FIN并发送ACK之后,被动段可能还有事情要处理并没有发送FIN的状态
LAST-ACK 被动端在发送了FIN等待对方ACK的状态