烟台市芝罘区建设局网站,自助建站是什么意思,免费建网站的程序,医院网站建设作用TCP网络协议是较常用的#xff0c;也基本上都会接触#xff0c;那么来简单了解下它吧。TCP 是一种面向连接的、可靠的传输协议#xff0c;它能够将数据分成一些小块#xff0c;并通过 Internet 进行传输。在 TCP 中#xff0c;数据被分割成一些称为 TCP 报文段#xff08…TCP网络协议是较常用的也基本上都会接触那么来简单了解下它吧。TCP 是一种面向连接的、可靠的传输协议它能够将数据分成一些小块并通过 Internet 进行传输。在 TCP 中数据被分割成一些称为 TCP 报文段TCP segment的小块每个 TCP 报文段携带了一部分数据以及一些用于传输控制的信息。本文将通过抓包分析介绍 TCP 报文段的结构和各个字段的含义与解析。
TCP传输层封包描述 抓包工具
本文使用 Wireshark 作为抓包工具。Wireshark 是一个流行的开源网络协议分析工具能够捕获和分析网络数据包。Wireshark 支持多种协议包括 TCP、UDP、HTTP 等。在本文中我们将使用 Wireshark 抓取并分析 TCP 报文段。
抓包分析
下面我们将通过抓包分析 TCP 报文段的结构和各个字段的含义。
打开 Wireshark选择一个合适的接口开始抓包。在本例中我们使用的是一个在局域网中运行的 TCP客户端与服务端链接示例。
选中任意一个 TCP 报文段Wireshark 会显示出该数据包的详细信息包括 TCP 报文段的结构和各个字段的值。下面是一个 TCP 报文段的示例SYNC包没有带data 我们逐一分析每个字段的含义和解析。 源端口号和目标端口号
源端口号Source Port和目标端口号Destination Port用于标识通信的源和目的地应用程序。在本例中源端口号为 12345目标端口号为 50302这表示这是一个从本地主机的端口号为 12345 的应用程序向远程服务器的端口号为 50302 的 TCP 服务器发送的数据。
2. 序列号和确认号
序列号Sequence Number表示本次传输数据的起始字节在整个数据流中的位置用于数据的重组和接收方确认使用。这里的0是相对序号wireshark自行减去的首次相对的。原始序号Sequence Number Raw2407429255
[Next Sequence Numvber:1 指的该方向下一包的序号这个不在数据流中是wireshark自己解析的
确认序号Acknowledgment Number 值为期望收到下一包的序号用于确认已经收到数据的偏移序号 示例中为0
3. 4位首部长度数据偏移占4位它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段因此数据偏移字段是必要的注意“数据偏移”的单位是字节。由于4位二进制数能表示的最大十进制数字是15因此数据偏移的最大值是60字节这也是TCP首部的最大字节即选项长度不能超过40字节60-20。 示例中这里的首部长度为8 * 4 44字节
4. 保留位
5. 标志位按位占用
1紧急URG当URG1时表明紧急指针字段有效。它告诉系统此报文段中有紧急数据应尽快发送相当于高优先级的数据而不要按原来的排队顺序来传送。例如已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题需要取消该程序的运行因此用户从键盘发出中断命令。如果不使用紧急数据那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。当URG置为1时发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针Urgent Pointer字段配合使用。
2确认ACK 仅当ACK 1时确认号字段才有效当ACK 0时确认号无效。TCP规定在连接建立后所有的传送的报文段都必须把ACK置为1。
3推送PSH当两个应用进程进行交互式的通信时有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下TCP就可以使用推送push操作。这时发送方TCP把PSH置为1并立即创建一个报文段发送出去。接收方TCP收到PSH1的报文段就尽快地即“推送”向前交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。一般这个不需要手动执标志TCP默认实现
4复位RST当RST1时表名TCP连接中出现了严重错误如由于主机崩溃或其他原因必须释放连接然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
5同步SYN在连接建立时用来同步序号。当SYN1而ACK0时表明这是一个连接请求报文段。对方若同意建立连接则应在响应的报文段中使SYN1和ACK1因此SYN置为1就表示这是一个连接请求或连接接受报文。
6终止FIN发送端完成任务表要求释放运输连接。
示例中是将SYN标志给执了起来 6. 窗口接收方的流量控制手段窗口大小为字节数起始于确认序号字段指明的值这个值是接收端正期望接收的字节。告诉发送端接收端目前允许发送端数据量。大小两字节65535在客户端与服务端TCP都允许的情况下选项中可存在窗口扩展选项。 示例中窗口大小65535代表告诉发送方从这个下一包0的序号开始接收方只能接受65535个字节长度了当然这里还没有算上扩展选项稍后再讲 7. 校验和2字节检验和覆盖了整个的TCP报文段: TCP首部和TCP数据。这是一个强制性的字段一定是由发端计算和存储并由收端进行验证。和UDP用户数据报一样在计算检验和时要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6TCP的协议号是6把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。 示例中0xfe34
8. 紧急指针2字节在紧急URG标志执1的时候有效代表一个偏移量和序号字段值相加代表紧急数据最后一个字节的序号。示例中 为0
9. 选项长度可变最长可达40字节。当没有使用“选项”时TCP的首部长度是20字节。其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示那么选项部分最长为(2^4-1)*4-2040字节。以下讲下最常见的一些选项
本次选项中看到有24字节 9.1 MSS(最大报文段长度-Maxium Segment Size)MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度而是“TCP报文段长度减去TCP首部长度”。 为什么要有MSS为了增加网络利用率
一般说来如果没有分段发生 MSS大部分时候还是越大越好。报文段越大允许每个报文段传送的数据就越多相对IP和TCP首部有更高的网络利用率。则MSS的默认值是536字节长这个默认值允许20字节的IP首部和20字节的TCP首部以适合576字节IP数据报
本示例中MSS为16344
9.2 其他选项 窗口扩大选项Windows Scaling是为了扩大窗口。我们知道TCP首部中窗口字段长度是16位因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的但对于包含卫星信道的网络传播时延和宽带都很大要获得高吞吐量需要更大的窗口大小。
1窗口扩大选项占3字节其中第一字节代表类型第二字节代表长度第三字节shift count则是扩展移位值S了新的窗口值等于TCP首部中的窗口位数从16增大到16S。移位值允许使用的最大值是14相当于窗口最大值增大到2^1614-12^30-1。
2窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大当它不再需要扩大其窗口时可发送S0选项使窗口大小回到16。
本示例中窗口扩大选项则是移位6等于扩展了64倍65565 * 2^6 时间戳选项Timestamps占10字节其中最主要的字段是时间戳字段4字节和时间戳回送回答字段4字节。时间戳选项有以下两个概念 1用来计算往返时间RTT往返时间。发送方在发送报文段时把当前时钟的时间值放入时间戳字段接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此发送方在收到确认报文后可以准确地计算出RTT来。为了减少任一端所维持的状态数量对于每个连接只保持一个时间戳的数值。选择何时更新这个数值的算法非常简单《TCP/IP详解》:
1 ) T C P 跟踪下一个 A C K 中将要发送的时间戳的值(一个名为 t s re c e n t 的 变 量 ) 以 及 最 后 发 送的 A C K 中的确认序号(一个名为 l a s t a c k的变量)。这个序号就是接收方期望的序号。
2) 当一个包含有字节号 l a s t a c k的报文段到达时则该报文段中的时间戳被保存在 t s re c e n t 中。
3) 无论何时发送一个时间戳选项 t s re c e n t就 作 为 时 间 戳 回 显 应 答 字 段 被 发 送 而 序 号 字 段被保存在 l a s t a c k 中。 2用于处理防止序号绕回PAWSTCP序号超过2^32的情况TCP报文段的序号只有32位而每增加2^32个序号就会重复使用原来用过的序号。当使用高速网络时在一次TCP连接的数据传送中序号很可能被重复使用。为了使接收方能够把新的报文段和迟到很久的报文段区分开则可以在报文段中加上这种时间戳。
本示例中 发送的3588061560因为是第一个SYN所以回复的是0 NOP(NO-Operation)它要求选项部分中的每种选项长度必须是4字节的倍数不足的则用NOP填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和SACK之间用NOP隔开
至此一个SYN包就解析完了对于PSH、ACK解析类似哦