Part 1
TCP协议的简单介绍
TCP(Transmission Control Protocol、传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。
更具体查看维基百科:https://zh.wikipedia.org/wiki/传输控制协议
TCP包头格式:
TCP标志位(标志符)
TCP数据包中的标识信号有6种:
- SYN(synchronous建立联机)
- �ACK(acknowledgement 确认)
- PSH(push传送)
- FIN(finish结束)
- RST(reset重置)
- URG(urgent紧急)
TCP状态码
- LISTEN
- SYN-SENT
- SYN-RECEIVED
- ESTABLISHED
- FIN-WAIT
- CLOSE-WAIT
- CLOSING
- LAST-ACK
- TIME-WAIT
- CLOSED
一次TCP连接和传输各TCP客户端的状态变化
下表为TCP状态码列表,以S指代服务器,C指代客户端,S&C表示两者,S/C表示两者之一:
状态码&终端 | 说明 |
---|---|
LISTEN S | 等待从任意远程TCP端口的连接请求。侦听状态。 |
SYN-SENT C | 在发送连接请求后等待匹配的连接请求。通过connect()函数向服务器发出一个同步(SYNC)信号后进入此状态。 |
SYN-RECEIVED S | 已经收到并发送同步(SYNC)信号之后等待确认(ACK)请求。 |
ESTABLISHED S&C | 连接已经打开,收到的数据可以发送给用户。数据传输步骤的正常情况。此时连接两端是平等的。 |
FIN-WAIT-1 S&C | 主动关闭端调用close()函数发出FIN请求包,表示本方的数据发送全部结束,等待TCP连接另一端的确认包或FIN请求包。 |
FIN-WAIT-2 S&C | 主动关闭端在FIN-WAIT-1状态下收到确认包,进入等待远程TCP的连接终止请求的半关闭状态。这时可以接收数据,但不再发送数据。 |
CLOSE-WAIT S&C | 被动关闭端接到FIN后,就发出ACK以回应FIN请求,并进入等待本地用户的连接终止请求的半关闭状态。这时可以发送数据,但不再接收数据。 |
CLOSING S&C | 在发出FIN后,又收到对方发来的FIN后,进入等待对方对连接终止(FIN)的确认(ACK)的状态。少见。 |
LAST-ACK S&C | 被动关闭端全部数据发送完成之后,向主动关闭端发送FIN,进入等待确认包的状态。 |
TIME-WAIT S/C | 主动关闭端接收到FIN后,就发送ACK包,等待足够时间以确保被动关闭端收到了终止请求的确认包。【按照RFC 793,一个连接可以在TIME-WAIT保证最大四分钟,即最大分段寿命(maximum segment lifetime)的2倍】 |
CLOSED S&C | 完全没有连接。 |
Part 2
一个可靠的TCP连接的建立
三次握手(three-way handshake)是发生在TCP层,三次握手的目的是建立一个链接采用三次握手确认建立一个连接,三次握手之后才开始用此连接发送数据包(通过三次交流,双方共发送了两次连接申请包和两次确认建立连接的包)
- 第一次握手:主机A发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
- 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),SYN=1,ACK=1,随机产生seq=7654321的包
- 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1,连接建立成功。
一个可靠的TCP连接的断开
四次挥手(four-way handshake)是发生在TCP层,四次挥手的目的是断开刚才建立的连接,四次挥手之后双方不在通信
- 第一次挥手:客户端A发送一个FIN,和一个随机数序列号i,代表请求与服务器B断开连接
- 第二次挥手:服务器B收到包之后,知道FIN请求,发送一个确认段ACK,和确认序号i+1,同时发送一个FIN和随机序列号j
- 第三次挥手:客户端A接收到ACK和序列号+1后确认是来自服务端B的,同时收到了服务器B的FIN和序列号j,然后发送ACK和序列号j+1给服务端B
- 第四次挥手:服务器B接收到客户单的ACK和j+1,确认断开。 连接断开成功。