计算机网络-传输层
计算机网络-传输层
xiaoyanTCP
TCP头结构详解
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。TCP头部包含了多个字段,用于实现连接管理、数据传输控制和错误检测等功能。以下是对TCP头部结构的详细解析:
TCP头结构
TCP头部通常包含20字节的固定部分和可选的40字节选项部分,总共最多60字节。以下是TCP头部的各个字段:
字段名称 | 位数 | 作用 |
---|---|---|
源端口号(Source Port) | 16 | 标识发送端应用程序的端口号。 |
目标端口号(Destination Port) | 16 | 标识接收端应用程序的端口号。 |
序号(Sequence Number) | 32 | 在建立连接时由计算机生成的随机数作为初始值,通过SYN 包传给接收端主机。每发送一次数据,就“累加”一次该“数字字节数”的大小。用于解决网络包乱序问题。 |
确认号(Acknowledgment Number) | 32 | 指下一次“期望”收到的数据的序列号。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。。 |
数据偏移(Data Offset) | 4 | 指示TCP头部的长度(以32位字为单位),即TCP头部的总字节数。 |
保留字段(Reserved) | 6 | 保留字段,未使用,必须设置为0。 |
控制位(Control Bits) | 6 | 包含多个控制标志位,用于控制TCP连接的建立、维护和终止。 |
窗口大小(Window Size) | 16 | 指示发送端可以接收的数据量(以字节为单位),用于流量控制。 |
校验和(Checksum) | 16 | 用于检测TCP头部和数据在传输过程中是否发生错误。 |
紧急指针(Urgent Pointer) | 16 | 当URG标志位为1时,指示紧急数据的结束位置。 |
选项(Options) | 长度可选,最大32位 | 可选字段,用于扩展TCP功能,如最大段大小(MSS)、窗口缩放因子等。 |
控制位(Control Bits)详解
标志位 | 作用(相应位为1时有效) |
---|---|
URG | 紧急指针有效,表示数据包中包含紧急数据,接收端应优先处理。 |
ACK | 确认号有效,表示确认号字段包含有效的确认信息。 |
PSH | 推送数据,接收端应尽快将数据交给应用程序,而不等待缓冲区满。 |
RST | 用于重置连接,当连接出现异常时,发送RST 包重置连接。 |
SYN | 用于建立连接,发送端和接收端通过交换SYN 和SYN-ACK 包来同步初始序号。 |
FIN | 用于终止连接,发送端和接收端通过交换FIN 和ACK 包来关闭连接。 |
TCP三次握手
TCP是面向连接的协议,所以在使用TCP之前必须通过TCP三次握手来建立TCP连接,流程图如下:
三次握手过程
- 初始状态
- 客户端:处于
CLOSE
状态。 - 服务器端:主动监听某个端口,处于
LISTEN
状态。
- 第一次握手(SYN)
- 客户端:
- 生成一个随机的初始序号(ISN,Initial Sequence Number),记为
client_isn
。 - 将
client_isn
放入TCP头部的序号字段中。 - 将控制位
SYN
设置为1,表示这是一个同步请求。 - 发送
SYN
包给服务器端。 - 发送完后,客户端进入
SYN-SENT
状态。
- 生成一个随机的初始序号(ISN,Initial Sequence Number),记为
- 第二次握手(SYN-ACK)
- 服务器端:
- 收到客户端发来的
SYN
包。 - 生成一个随机的初始序号(ISN),记为
server_isn
。 - 将
server_isn
放入TCP头部的序号字段中。 - 将客户端发来的
SYN
包中的序号加1(即client_isn + 1
)存放到TCP头部的确认号字段中。 - 将控制位
SYN
和ACK
设置为1,表示这是一个同步确认响应。 - 发送
SYN-ACK
包给客户端。 - 发送完后,服务器端进入
SYN-RCVD
状态。
- 收到客户端发来的
- 第三次握手(ACK)
- 客户端:
- 收到服务器端发来的
SYN-ACK
包。 - 将TCP头部的序号字段值加1(即
client_isn + 1
)。 - 将服务器端发来的序号加1(即
server_isn + 1
)存放到TCP头部的确认号字段中。 - 将控制位
ACK
设置为1,表示这是一个确认响应。 - 此时可以在报文后携带应用层的数据。
- 发送
ACK
包给服务器端。 - 发送完后,客户端进入
ESTABLISHED
状态。
- 收到服务器端发来的
- 服务器端:
- 收到客户端发来的
ACK
包。 - 服务器端进入
ESTABLISHED
状态。
- 收到客户端发来的
步骤 | 客户端状态 | 服务器端状态 | 描述 |
---|---|---|---|
1 | CLOSE |
LISTEN |
客户端和服务器端初始状态。 |
2 | SYN-SENT |
LISTEN |
客户端发送SYN 包,进入SYN-SENT 状态。 |
3 | SYN-SENT |
SYN-RCVD |
服务器端收到SYN 包,进入SYN-RCVD 状态,发送SYN-ACK 包。 |
4 | ESTABLISHED |
SYN-RCVD |
客户端收到SYN-ACK 包,进入ESTABLISHED 状态,发送ACK 包。 |
5 | ESTABLISHED |
ESTABLISHED |
服务器端收到ACK 包,进入ESTABLISHED 状态,连接建立完成。 |
三次握手的特点
- 前两次握手不携带数据:第一次握手(
SYN
)和第二次握手(SYN-ACK
)不携带应用层数据,只包含TCP头部信息。 - 第三次握手可以携带数据:第三次握手(
ACK
)可以携带应用层数据,因为此时双方都已经确认了对方的初始序号,连接已经建立。 - 同步初始序号:通过三次握手,客户端和服务器端同步了初始序号(ISN),确保双方在数据传输过程中能够正确识别数据包的顺序。
- 确认机制:通过确认号(Acknowledgment Number),双方可以确认对方已经接收到的数据包,确保数据的可靠传输。
TCP为什么要进行三次握手
- 三次握手才可以防止历史连接(主要原因):假设只进行两次握手,当网络拥塞时客户端发送了多个数据,假如旧的
SYN
包先到达服务器端,服务器端收到后向客户端返回SYN-ACK
包后就立即进入了ESTABLISH
状态,虽然客户端能够分辨出这是历史连接,但服务器端并没有中间状态来预防,而是直接建立了一个历史连接,浪费了资源。 - 三次握手才可以同步序列号
- 三次握手才可以避免浪费资源