TCP协议的学习 (二)TCP头部信息

TCP头部信息

20个字节固定头部结构
40个字节头部选项字段
这里写图片描述
TCP头部结构

typedef struct _TCP_HEADER
{
short m_sSourPort;       // 源端口号16bit
short m_sDestPort;        // 目的端口号16bit
unsigned int m_uiSequNum;   // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确认号32bit
short m_sHeaderLenAndFlag;   // 前4位:TCP头长度;中6位:保留;后6位:标志位
short m_sWindowSize;      // 窗口大小16bit
short m_sCheckSum;       // 检验和16bit
short m_surgentPointer;      // 紧急数据偏移量16bit
}attribute((packed))TCP_HEADER, *PTCP_HEADER;

16位源端口:告知主机该报文段来自哪里
16位目标端口:传给哪个上层协议或者应用程序
客户端通常使用系统自动选择的临时端口号,服务器使用知名的服务器端口号
在Linux下,所有的知名的服务器端口号都定义在etc/server底下

这里写图片描述
32位序号:每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收。当一个主机开启一个TCP会话时,它的序列号被系统初始化为某个随机值ISN。后续的TCP报文段中序号加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。

32位确认号:目的主机返回确认号,使源主机知道某个或几个报文段已被接收
这里写图片描述
4位头部长度:指示何处数据开始

16位窗口大小:长度为16位,2个字节,表示想收到的每个TCP数据段的大小

16位校验和:长度为16位,2个字节,由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏

16位紧急指针:长度为16位,2个字节,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

TCP头部选项字段
Kind(1字节)+ length(1字节)+ 内容(n字节)
这里写图片描述
TCP头部选项

Kind=0 选项表结束选项
Kind=1 空操作选项
Kind=2 最大报文段长度选项
Kind=3 窗口扩大因子选项 TCP连接初始化时,通讯双方使用该选项来协商接受通告窗口的扩大因子 只能出现在同步报文段中
Kind=4 选择确认选项(SACK) TCP通信中,某个报文段丢失,TCP模块会重发最后确认的TCP报文段的后续所有报文段,这可能导致重复,SACK技术直接发送丢失的报文段就好。
Kind=5 SACK实际工作选项 该选项参数告诉发送方本端已经收到并缓存不连续的数据块,发送端根据此选项检查并重发丢失的数据块
Kind=8 时间戳选项 比较准确的计算通讯双方的回路时间的方法

猜你喜欢

转载自blog.csdn.net/qq_34501940/article/details/51073691