TCP首部的URG和PSH

本文详细解析了TCP协议中的URG和PSH标志的作用及其区别。URG标志用于标识紧急数据,并确保这些数据能立即送达应用程序,而不受常规数据流的影响。PSH标志则指示接收方TCP立即传递数据给接收应用,而不是等到缓冲区满才传递。

1、URG推送位

紧急数据的起始点=序号;
紧急数据的终止点=序号+紧急指针;

(综上,(URG)紧急指针就是记录紧急数据的字节数,紧急指针永远为正数)

1)在紧急数据后面的数据为普通数据,需要按序缓存
2)窗口为0也可以发送紧急数据
3)紧急数据都处理完成后,tcp就告诉进程恢复到正常操作
例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消程序的运行。因此用户从键盘发出中断命令(Ctrl+C)。如果不使用紧急数据,那么这两个字符会被存储在接受TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才会被交付给接收方。这样就浪费了很多时间。

URG强调的是直接读取数据,我们不会将该数据复制到缓存中,我个人认为,这个数据(紧急指针指向的数据)并不是真正意义上的”数据”,而是对真正意义上”数据”的一种操作.

2、PSH推送位

PSH=1,该报文希望,到达对端时,将这个报文及缓存区之间缓存尚未交付的数据一并交付给进程。
1)PSH的数据=本报文数据+缓存区数据
2)PSH的方向—>单方向(接收PSH报文的一端)

PSH强调的是尽快将数据交付给上层(协议),而不需要经过强迫数据交互(默认tcp/ip是将数据缓存到一定的上限,再将数据递交给上层,以提高网络性能).可见,该部分数据是需要复制到缓存中的

3、区别

URG交付给进程的数据:只有紧急数据

PSH交付给进程的数据:缓冲区排好序的数据及当前报文中的数据
两者的共同点:都是一种对数据的处理方式.只不过URG是处理在前端(收到数据后立马对真正意义上”数据”进行操作,所以说”紧急.而PSH是在处理的后端,告诉内核,不用等待”满了”再递交数据递交到上层.

TCPIP协议是网络通信中的两个核心协议,分别工作在传输网络层。它们的首部结构字段设计反映了各自的功能需求数据传输的控制机制。 ### TCP首部结构与字段 TCP(Transmission Control Protocol)是面向连接的、可靠的、基于字节流的传输层协议。其首部长度通常为20字节,但可以扩展到最多60字节,具体取决于选项字段的存在与否。 TCP首部的主要字段包括: - **源端口号(Source Port)**:16位,标识发送端的端口号。 - **目的端口号(Destination Port)**:16位,标识接收端的端口号。 - **序列号(Sequence Number)**:32位,用于标识从TCP发送端向接收端发送的数据字节流的起始编号。 - **确认号(Acknowledgment Number)**:32位,表示期望收到的下一个字节的编号。 - **数据偏移(Data Offset)**:4位,指示TCP首部的长度(以32位字为单位),也即首部中32位字的数量。 - **保留(Reserved)**:6位,保留字段,通常为0。 - **标志位(Flags)**: - **URG**:紧急指针有效。 - **ACK**:确认号有效。 - **PSH**:提示接收方应该尽快将这个报文段交给应用层。 - **RST**:重建连接。 - **SYN**:同步序号,用于建立连接。 - **FIN**:发送端完成数据发送任务。 - **窗口大小(Window Size)**:16位,表示从确认号开始,接收方当前能够接收的最大数据量(以字节为单位),用于流量控制。 - **校验(Checksum)**:16位,用于校验TCP首部数据的完整性。 - **紧急指针(Urgent Pointer)**:16位,指出在本报文段中紧急数据的最后一个字节的序号。 - **选项(Options)**:可变长度,通常用于支持最大段大小(MSS)、间戳等扩展功能。 ### IP首部结构与字段 IP(Internet Protocol)是网络层协议,负责将数据从源主机传送到目的主机。IPv4首部长度通常为20字节,但也可以扩展到最多60字节,取决于选项字段的存在。 IPv4首部的主要字段包括: - **版本(Version)**:4位,标识IP协议的版本,如IPv4或IPv6。 - **首部长度(IHL, Internet Header Length)**:4位,表示IP首部的长度(以32位字为单位)。 - **服务类型(Type of Service, ToS)**:8位,用于指定数据报的优先级服务类型,如延迟、吞吐量、可靠性成本等。 - **总长度(Total Length)**:16位,表示整个IP数据报的长度(包括首部数据部分),单位为字节。 - **标识(Identification)**:16位,用于唯一标识主机发送的每一个数据报,主要用于分片重组。 - **标志(Flags)**:3位,用于控制是否允许分片以及是否是最后一个分片。 - **片偏移(Fragment Offset)**:13位,表示该分片在原始数据报中的位置。 - **生存间(Time to Live, TTL)**:8位,表示数据报的最大跳数,每经过一个路由器减1,减到0丢弃。 - **协议(Protocol)**:8位,标识上层协议类型,如TCP(6)、UDP(17)等。 - **首部校验(Header Checksum)**:16位,用于校验IP首部的完整性,包括数据部分。 - **源IP地址(Source IP Address)**:32位,标识发送端的IP地址。 - **目的IP地址(Destination IP Address)**:32位,标识接收端的IP地址。 - **选项(Options)**:可变长度,用于支持间戳、记录路由等扩展功能。 ### 总结 TCP首部IP首部的设计反映了它们在协议栈中的同角色。TCP首部主要关注端到端的可靠数据传输,包括连接管理、流量控制错误检测等功能;而IP首部则负责数据报的路由转发,确保数据能够从源主机传送到目的主机。两者在字段设计上各有侧重,但都提供了必要的控制信息以支持网络通信的正常进行。 ```c // TCP首部结构体定义示例 struct tcphdr { uint16_t source; // 源端口号 uint16_t dest; // 目的端口号 uint32_t seq; // 序列号 uint32_t ack_seq; // 确认号 uint16_t res1:4, // 数据偏移 doff:4, // 数据偏移 fin:1, // FIN标志 syn:1, // SYN标志 rst:1, // RST标志 psh:1, // PSH标志 ack:1, // ACK标志 urg:1, // URG标志 ece:1, // ECE标志 cwr:1; // CWR标志 uint16_t window; // 窗口大小 uint16_t check; // 校验 uint16_t urg_ptr; // 紧急指针 }; // IP首部结构体定义示例 struct iphdr { uint8_t version:4, // 版本 ihl:4; // 首部长度 uint8_t tos; // 服务类型 uint16_t tot_len; // 总长度 uint16_t id; // 标识 uint16_t frag_off; // 标志片偏移 uint8_t ttl; // 生存间 uint8_t protocol; // 协议 uint16_t check; // 校验 uint32_t saddr; // 源IP地址 uint32_t daddr; // 目的IP地址 }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值