网络:传输层 TCP报文格式解析
一、TCP报文格式
1、为了提供可靠的数据传输,TCP报文首部字段有较多的字段,TCP报文格式如下图:
![](/assets/blank.gif)
图2 TCP报文格式
16位源和目标端口(16位):用于多路复用/多路分解来自或送至上层应用的数据,可以这样理解,端口用来标识同一台计算机的不同进程。
16位源端口号(Source Port):16位的源端口字段包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。
16位目的端口(Destination Port):16位的目的端口字段定义传输的目的。这个端口指明接收方计算机上的应用程序接口。
32位序列号和32位确认号
这两个字段是TCP可靠传输服务的关键部分,序列号是该报文段首字节的字节流编号(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号)。这样理解可能更直观,当报文被分解成多个报文段时,序列号就是报文段首字节在整个报文的偏移量。确定号指定下一个期待的字节。
32位序列号(Sequence Number):该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第几个数据字节。序列号是一个32位的数。
32位确认号(Acknowledge Number):TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被设置时才有效。
首部长度(4位)
因为选项是不定长的,这就需要标识整个首部字段的长度(单位是32位字),即5+选项个数。4位,单位是32位字,所以首部最长是15*4=60字节,即选项最长是40字节(10个选项)。
保留(6位):
6位值域,必须全0,为定义新的用途而保留。
6位标志
URG
指示报文段里存在着被发送方的上层实体标记为”紧急”数据,当URG=1时,其后的紧急指针指示紧急数据在当前数据段中的位置(相对于当前序列号的字节偏移量),TCP接收方必须通知上层实体。
ACK
当ACK=0时,表示该数据段不包含确认信息,当ACK=1时,表示该报文段包括一个对已被成功接收报文段的确认。
PSH
当PSH=1时,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。
RST
用于重置一个已经混乱的连接(如主崩溃),也可用于拒绝一个无效的数据段或者拒绝一个连接请求。一般而言,如果你得到的数据段被设置了RST位,那说明你这一端有问题了。
SYN
用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
注:捎带是指对客户机到服务器数据的确认被装载在一个承载服务器到客户机的数据报文段中。
FIN
用于释放一个连接,表示发送方已经没有数据要传输了。此时,接收方可能继续接收数据,好在SYN和FIN数据段都有序列号,从而保证了这两种数据段以正确顺序被处理。
16位窗口大小
用于流控制(确保连接的任何一方都不会过快地发送过量的分组而淹没另一方),窗口大小指定了从被确认的字节算起可以发送多少个字节。
16位校验和
占2个字节,校验的范围包括首部和数据两个部分,计算校验和时需要在报文段前加上12字节的伪首部。
16位紧急指针
参考标志字段的URG位。
选项
选项部分是为了适合复杂网络环境和更好地服务于应用层设计的。TCP选项最长是40字节(见下文)。
数据
无任何数据的TCP段也是合法的,通常用于确认和控制信息。
2 、选项字段[2]
TCP选项部分很好出现在已经建立连接的会话中,只要出现在TCP连接建立阶段,即三次握手。TCP选项部分实际运用有以下几种:
(1)最大报文传输段(MMS, Maximum Segment Size)
用于发送发与接收方协商最大报文段长度(仅仅是净荷数据,不包括TCP首部字段)。TCP在三次握手中,每一方都会通告期望收到的MSS(MSS只出现在SYN数据包中),如果一方不接受另一方的MSS值,则使用默认的536字节净荷数据,即主机能够接受20+536字节的TCP报文段。
(2)窗口扩大选项(Window scaling)
TCP报文的窗口大小字段占16位,即最大值是65535,但随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口满足性能和吞吐率,这就是窗口扩大选项存在的意义。例子见参考资料[2]。
Windows scaling占3个字节,最后一个字节是移位值(Shift count),即首部的窗口位数16向左移动,如移位值为14,则新的窗口最大值增大到65535*(2^14)。
窗口扩大选项是在TCP建立之初进行协商,如果已实现了窗口扩大,当不再需要扩大窗口时,发送移位值=0就可以恢复到原窗口大小,即65535。
(3)选择确认选项(SACK, Selective Acknowledgements)
考虑这样情况,主机A发送报文段12345,主机B收到135且报文无差错,SACK用来确保只重传缺少的报文段,而不是重传所有报文段。
SACK选项需要2个功能字节,一个用来指明使用SACK选项(SACK Permission),另一指明这个选项占多少字节。
那怎么形容丢失的报文段2,说明2的左右边界分别是1、3。TCP的数据报文是有字块边界的,而这种边界是由序列号表示的。
最多能指明多少个字节块的边界信息呢?答案是4个。这是因为选项字段最大是40字节,去除2个功能字节,序列号是32位即4字节,并且需要左右边界,所以(40-2)/8 = 4。
(4)时间戳选项(timestamps)
时间戳选项用来计算往返时间RTT,发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方将该时间戳字段的值复制到确认报文中,当接收方收到确认报文,对比确认报文的时间戳(等于发送方发送报文段的时间戳)和现在的时钟,即可算出RTT。
时间戳选项还可用于防止回绕序号PAWS。序列号只有32位,每2^32个序列号就会回绕(想想环形队列),采用时间戳选项很容易区分相同序列号的报文段。
(5)NOP(NO-Operation)
TCP的头部必须是4字节的倍数,而大多数选项不是4字节倍数,不足的用NOP填充。除此之外,NOP也用于分割不同的选项数据,如窗口扩大选项和SACK之间使用NOP隔离(下面的实例将看到这一点)。
3、URG(紧急标志)和PSH(推标志)
URG:
指示报文段里存在着被发送方的上层实体标记为”紧急”数据,当URG=1时,
系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送,
其后的紧急指针指示紧急数据在当前数据段中的位置(相对于当前序列号的字节偏移量,数据从第一个字节到指针所指的字节就是紧急数据),紧急数据不进入
接收缓冲区直接交给上层进程,TCP接收方必须通知上层实体。
PSH:
发送方TCP把PSH置1,并立即创建一个报文端发送出去。接收方TCP收到PSH=1的报文段,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。
网络:传输层 TCP报文格式解析相关推荐
- TCP 的那些事 | TCP报文格式解析
TCP(Transmission Control Protocol 传输控制协议)提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之 ...
- 网络知识-05 传输层-TCP
文章目录 3 传输控制协议TCP 3.1 TCP的特点 3.2 TCP的连接 3.3 TCP可靠传输的原理 3.3.1 自动重传请求ARQ(Automatic Repeat reQuest) 3.3. ...
- 网络原理 --- 传输层Ⅱ TCP协议中的确认应答,超时重传和连接管理
文章目录 网络原理 传输层 TCP 协议 TCP的基本特性 1.确认应答 2.超时重传 3.连接管理 ❗❗①建立连接(三次握手) ②断开连接(四次挥手) 总结 网络原理 介绍TCP/IP协议中每一层里 ...
- 深度解析dubbo网络传输层Transporter
本文基于dubbo v2.6.x 1.传输层 dubbo网络传输层的一个介绍(dubbo 官方文档:链接): 抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Cha ...
- 【网络原理】- 传输层 TCP 十大机制 / UDP 协议 自定义应用层协议
目录 1.自定义应用层协议 1.1 自定义协议,应该如何约定 2.传输层 UDP/TCP 原理 2.1 UDP协议 2.2 传输层 TCP 的十大机制 2.2.1 确认应答 2.2.2 超时重传 2. ...
- tcp报文格式_腾讯面试中的TCP/IP协议简述+经典面试题
面试题有福利 TCP/IP协议简述+ TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器, ...
- 传输层 - TCP / UDP 协议详解
我是目录: 1.UDP协议: 2.TCP协议: (1)TCP协议段格式: (2)确认应答(ACK)机制 (3)超时重传机制: (4)连接管理机制(三次握手.四次挥手) (5)滑动窗口: (6)流量控制 ...
- 网络传输协议-tcp、ip、http简介
一.引言 在网络数据传输过程中有可能会存在数据丢包.延时.重复等问题,为了使对数据传输的处理更加简单直观,对该过程进行分层. 1.1.OSI 7层参考模型 OSI(Open System Interc ...
- Python--网络编程-----传输层tcp/udp协议
一.传输层的功能是建立端口到端口的通信 二.TCP协议 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TC ...
最新文章
- 什么是JavaBean
- python获取window共享目录列表_利用Python获取DICOM RTstructure勾画列表
- 云原生之容器安全实践
- OJ1012: 求绝对值
- c++ linux 获取毫秒_Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间
- 华为无盘服务器,无盘服务器操作系统
- go 协程回调函数 传入参数_ECMAScript 6 入门教程—Generator 函数的异步应用
- Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 1:解码文件头
- 关于爬取网易云全部评论的一些疑问
- 搜狗输入法在别的屏幕
- AI助力智能安检,基于目标检测模型实现X光安检图像智能检测分析
- The YARN Timeline Service v.2
- Blockstack: A Global Naming and Storage System Secured by Blockchains
- android开启软键盘,Android肿么弹出软键盘,和开启软键盘
- 基于lstm+crf实现电子病历实体信息识别 完整的代码+数据集+说明 毕设
- OpenGL 凹凸贴图实例
- 电子钱包电子存折,区别
- 研发计算机主板需要什么专业,一种计算机主板研发用固定装置的制作方法
- HashSet获取第一个元素
- OO,OO以后,及其极限
热门文章
- Android中下载、安装和卸载(原)
- 自己动手焊制硬件开发板
- 【云周刊】第205期:阿里云重磅开源实时计算平台Blink,挑战计算领域的“珠峰”...
- dspmq dspmqver command not found(dspmq命令找不到,dspmqver主安装目录设置不正确
- shell循环结构之while循环
- MailBee.NET Objects发送电子邮件(SMTP)教程六:创建并发送带有附件的邮件
- Autowire异常
- linux禁止ping
- VMware桥接模式无法连网
- 你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数