【计算机网络】TCP报文详解

认识TCP报头

其实协议的形式都是一个结构化的数据,TCP协议也不例外。一起来看看TCP协议的报头是怎么样的。

在这里插入图片描述

以上就是TCP报头,实际上是一个结构化的数据,也就是一个结构体。例如:

struct tcp_hdr
{
   
   
    unsigned int stc_port : 16;
    unsigned int desc_port : 16; 
    unsigned int seq;
    unsigned int ack_seq;
    ....
};

目的端口号&&源端口号

其中16位源端口号,就是你当前发送报文的端口号。目的端口号则是目标主机的端口号。

这也就是我们在用accept时,能够获取连接套接字的同时,还能获取到对端主机的端口号(ip也获取到了,这个在网络层的时候解释)。 而目的端口号也很好理解,因为端口号能够确定一台主机中唯一的一个进程。当你的报文被发送到对端主机的时候,就能够通过端口号去锁定对应的PCB进程。

4位首部长度

4位首部长度代表的是报头占多

### TCP四次挥手的报文结构详解 #### 1. 第一次挥手(FIN=1) 在TCP四次挥手过程中,客户端首先发送一个带有`FIN=1`标志位的报文段给服务端,表示客户端已经没有数据需要发送,并希望关闭连接。此时,客户端进入`FIN_WAIT_1`状态[^4]。 - **报文结构**: - 源端口:客户端使用的端口号。 - 目的端口:服务端监听的端口号。 - 序号(Seq):当前报文段的序列号。 - 确认号(Ack):期望收到的下一个字节的序号。 - 标志位:`FIN=1`,表示连接释放请求。 - 窗口大小:通知接收方发送本报文时可用的窗口大小。 - 校验和:用于校验报文段的完整性。 ```python # 示例代码:第一次挥手的报文结构 first_wave = { "source_port": 12345, # 客户端端口 "destination_port": 80, # 服务端端口 "sequence_number": 100, # 当前报文段的序列号 "acknowledgment_number": 200, # 期望收到的下一个字节的序号 "flags": {"FIN": 1}, # FIN标志位设置为1 "window_size": 65535, # 窗口大小 "checksum": 0x1234 # 校验和 } ``` #### 2. 第二次挥手(ACK=1) 服务端收到客户端的`FIN`报文后,会发送一个带有`ACK=1`标志位的确认报文段给客户端,确认已收到连接释放请求。此时,服务端进入`CLOSE_WAIT`状态,而客户端进入`FIN_WAIT_2`状态[^4]。 - **报文结构**: - 源端口:服务端使用的端口号。 - 目的端口:客户端使用的端口号。 - 序号(Seq):当前报文段的序列号。 - 确认号(Ack):对客户端`FIN`报文的确认号,值为客户端`FIN`报文的序列号加1。 - 标志位:`ACK=1`,表示确认。 - 窗口大小:通知接收方发送本报文时可用的窗口大小。 - 校验和:用于校验报文段的完整性。 ```python # 示例代码:第二次挥手的报文结构 second_wave = { "source_port": 80, # 服务端端口 "destination_port": 12345, # 客户端端口 "sequence_number": 200, # 当前报文段的序列号 "acknowledgment_number": 101, # 对客户端FIN报文的确认号 "flags": {"ACK": 1}, # ACK标志位设置为1 "window_size": 65535, # 窗口大小 "checksum": 0x5678 # 校验和 } ``` #### 3. 第三次挥手(FIN=1, ACK=1) 当服务端完成所有数据的发送后,也会向客户端发送一个带有`FIN=1`和`ACK=1`标志位的报文段,表示服务端也没有数据需要发送了。此时,服务端进入`LAST_ACK`状态[^4]。 - **报文结构**: - 源端口:服务端使用的端口号。 - 目的端口:客户端使用的端口号。 - 序号(Seq):当前报文段的序列号。 - 确认号(Ack):对客户端之前发送的数据或报文的确认号。 - 标志位:`FIN=1`和`ACK=1`,表示连接释放请求及确认。 - 窗口大小:通知接收方发送本报文时可用的窗口大小。 - 校验和:用于校验报文段的完整性。 ```python # 示例代码:第三次挥手的报文结构 third_wave = { "source_port": 80, # 服务端端口 "destination_port": 12345, # 客户端端口 "sequence_number": 300, # 当前报文段的序列号 "acknowledgment_number": 101, # 对客户端之前发送的数据或报文的确认号 "flags": {"FIN": 1, "ACK": 1}, # FIN和ACK标志位设置为1 "window_size": 65535, # 窗口大小 "checksum": 0x9ABC # 校验和 } ``` #### 4. 第四次挥手(ACK=1) 客户端收到服务端的`FIN`报文后,进入`TIME_WAIT`状态,并发送一个带有`ACK=1`标志位的确认报文段给服务端。服务端收到该确认报文后,进入`CLOSED`状态,完成整个四次挥手过程[^4]。 - **报文结构**: - 源端口:客户端使用的端口号。 - 目的端口:服务端使用的端口号。 - 序号(Seq):当前报文段的序列号。 - 确认号(Ack):对服务端`FIN`报文的确认号,值为服务端`FIN`报文的序列号加1。 - 标志位:`ACK=1`,表示确认。 - 窗口大小:通知接收方发送本报文时可用的窗口大小。 - 校验和:用于校验报文段的完整性。 ```python # 示例代码:第四次挥手的报文结构 fourth_wave = { "source_port": 12345, # 客户端端口 "destination_port": 80, # 服务端端口 "sequence_number": 101, # 当前报文段的序列号 "acknowledgment_number": 301, # 对服务端FIN报文的确认号 "flags": {"ACK": 1}, # ACK标志位设置为1 "window_size": 65535, # 窗口大小 "checksum": 0xDEF0 # 校验和 } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林 子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值