大家好,又见面了,我是你们的朋友全栈君。
TCP协议
- tcp报文段
- 源端口&目的端口 2字节 (tcp的分用功能以端口实现)
- 序号 4字节 tcp三次握手中的seq,表示tcp数据段发送的第一个字节的序号,范围[0,2^32 – 1],即mod 2^32; 例如,seq = 201,携带的数据有100,那么最后一个字节的序号就为300,那么下一个报文段就应该从401开始,下一个序列的首地址. tcp是面向字节流的,在tcp连接中每一个字节流都按顺编号
- 确认号 4字节 为期望收到对方下一个报文段的第一个数据字节序号
注意:若确认号=N,则表示序号N-1为止的序列号已正确收到
- 数据偏移 4位 指出偏移多远,实际就是指定报文段的首部长度 因为占4位,最大15,因此数据最大偏移为60:即为tcp首部最大长度
- 控制位 6位
URG 为1表示高优先级数据包,紧急指针字段有效。 (告诉系统此报文段有紧急数据,应尽快传输,而不要原来的排队顺序)
ACK ==1 表示确认号字段有效(连接建立后,传输的报文段都应该置为1) ==0 确认号无效
PSH 为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
RST 为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。 RST 可称为重建位&重置位 SYN 为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步 当 syn=1&ack=1,表明这是一个连接请求报文段 FIN ==1 表示发送方没有数据要传输了,要求释放连接
- 窗口 2字节 表示从确认号开始,本报文的接受方可以接收的字节数,即接收窗口大小,用于流量控制。 (窗口字段明确指出了现在允许对方发送的数据量:窗口大小经常是在动态变换着的!)
- 校验和 2字节 对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
- 紧急指针 2字节 本报文段中的紧急数据的最后一个字节的序号。本报文段中的紧急数据的最后一个字节的序号。
- 选项字段—最多40字节 每个选项的开始是1字节的kind字段,说明选项的类型。 每个选项的开始是1字节的kind字段,说明选项的类型。 附:详细解释
选项表结束(1字节) 无操作(1字节) 用于选项字段之间的字边界对齐。 最大报文段长度 (4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。 窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。 sackOK—发送端支持并同意使用SACK选项。 SACK实际工作的选项。 时间戳(10字节,TCP Timestamps Option,TSopt) 发送端的时间戳(Timestamp Value field,TSval,4字节) 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)
附:详细的存储图
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126175.html原文链接:https://javaforall.cn