TCP 报文段结构
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用 16 位表示的,可推算计算机的端口个数为 2^16 个。
序列号:表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由 32 位表示,所以每 2^32 个字节,就会出现序列号回绕,再次从 0 开始。那如何区分两个相同序列号的不同 TCP 报文段就是一个问题了,后面会有答案,暂时可以不管。
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号。也就是告诉发送方:我希望你(指发送方)下次发送给我的 TCP 报文段的序列号字段的值是这个确认号。
TCP 首部长度:由于 TCP 首部包含一个长度可变的选项部分,所以需要这么一个值来指定这个 TCP 报文段到底有多长。或者可以这么理解:就是表示 TCP 报文段中数据部分在整个 TCP 报文段中的位置。该字段的单位是 32 位字,即:4 个字节。
URG:表示本报文段中发送的数据是否包含紧急数据。URG=1,表示有紧急数据。后面的紧急指针字段只有当 URG=1 时才有效。
ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
PSH:告诉对方收到该报文段后是否应该立即把数据推送给上层。如果为 1,则表示对方应当立即把数据提交给上层,而不是缓存起来。
RST:只有当 RST=1 时才有用。如果你收到一个 RST=1 的报文,说明你与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明你上次发送给主机的数据有问题,主机拒绝响应。
SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才置为 1。
FIN:标记数据是否发送完毕。如果 FIN=1,就相当于告诉对方:“我的数据已经发送完毕,你可以释放连接了”
窗口大小:表示现在运行对方发送的数据量。也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量。
校验和:提供额外的可靠性。具体如何校验,参考其他资料。
紧急指针:标记紧急数据在数据字段中的位置。
选项部分:其最大长度可根据 TCP 首部长度进行推算。TCP 首部长度用 4 位表示,那么选项部分最长为:(2^4-1)*4-20=40 字节。
选项部分的应用:
MSS 最大报文段长度 (Maxium Segment Size):指明数据字段的最大长度,数据字段的长度加上 TCP 首部的长度才等于整个 TCP 报文段的长度。MSS 值指示自己期望对方发送 TCP 报文段时那个数据字段的长度。通信双方可以有不同的 MSS 值。如果未填写,默认采用 536 字节。MSS 只出现在 SYN 报文中。即:MSS 出现在 SYN=1 的报文段中。
窗口扩大选项 (Windows Scaling):由于 TCP 首部的窗口大小字段长度是 16 位,所以其表示的最大数是 65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。
SACK 选择确认项 (Selective Acknowledgements):用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机 A 发送报文段 1、2、3,而主机 B 仅收到报文段 1、3。那么此时就需要使用 SACK 选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用 SACK 需要两个功能字节。一个表示要使用 SACK 选项,另一个指明这个选项占用多少字节。描述丢失的报文段 2,是通过描述它的左右边界报文段 1、3 来完成的。而这个 1、3 实际上是表示序列号,所以描述一个丢失的报文段需要 64 位即 8 个字节的空间。那么可以推算整个选项字段最多描述 (40-2)/8=4 个丢失的报文段。
时间戳选项(Timestamps):可以用来计算 RTT(往返时间),发送方发送 TCP 报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出 RTT。也可以用来防止回绕序号 PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用 32 为表示,每 2^32 个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。
NOP(NO-Operation):它要求选项部分中的每种选项长度必须是 4 字节的倍数,不足的则用 NOP 填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和 SACK 之间用 NOP 隔开。
TCP 报文段结构的更多相关文章
- 计算机网络(8)-----TCP报文段的首部格式
TCP报文段的首部格式 概述 TCP报文段首部的前20个字节是固定的,因此TCP首部的最小长度是20字节. 源端口和目标端口 各占2个字节,分别写入源端口号和目的端口号. 序列号 占4个字节,表示本报 ...
- TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。
from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...
- 一个TCP报文段的数据部分最多为多少个字节,为什么
IP数据报的最大长度=2^16-1=65535(字节)TCP报文段的数据部分=IP数据报的最大长度-IP数据报的首部-TCP报文段的首部=65535-20-20=65495(字节) 一个tcp报文段的 ...
- 运输层5——TCP报文段的首部格式
写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4--TCP可靠运输的工作原理 ...
- 计算机网络(三),TCP报文段详解
目录 1.TCP(Transmission Control Protocol传输控制协议)作用 2.TCP报文段详解 三.TCP报文段详解 1.TCP(Transmission Control Pro ...
- TCP报文段首部格式详解
TCP首部格式 格式字段详解 源端口.目标端口: 计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两 ...
- TCP报文段的首部格式 20字节的固定首部
<---- IP首部 TCP首部 TCP报文段的数据部分 <---- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- TCP报文段首部详解
TCP虽然是面向字节流的,但是tcp传送的数据单元却是报文段,一个报文段分为首部和数据两部分,几乎TCP所有功能都从首部来体现,下面我们来详细的剖析下它的首部. (1):源端口与目标端口:分别写入源端 ...
随机推荐
- thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片)
thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise ...
- solr源码导入eclipse 分类: H4_SOLR/LUCENCE 2014-07-14 14:11 550人阅读 评论(1) 收藏
转载自:http://blog.csdn.net/vltic/article/details/19917377 (1)相应的开发环境准备 (1)jdk1.6+的安装和环境变量配置(命 ...
- 设置UIButton的文字显示位置、字体的大小、字体的颜色
btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlS ...
- WD-保修验证(WCC7K4ARTDF1)
https://support.wdc.com/warranty/warrantystatus.aspx?lang=cn WCC7K4ARTDF1 有限保修期限内 WD40EFRX WD Red 09 ...
- runtimeException也是能够捕获的
如题, 运行结果: bbb abcdef @Test public void testRuntimeException() { ; try { aaa333(); } catch (Exception ...
- [React Unit Testing] React unit testing demo
import React from 'react' const Release = React.createClass({ render() { const { title, artist, outO ...
- [React Native] Writing Platform-Specific Components for iOS and Android in React Native
Learn to write components that render differently on iOS and Android, but present the same API. Firs ...
- Thrift写RPC接口
Thrift总结(二)创建RPC服务 前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口.不清楚的可以看这个<Thrift总结(一)介绍>. ...
- js进阶 9-7 自动计算商品价值
js进阶 9-7 自动计算商品价值 一.总结 一句话总结: 1.form表单控件value属性:属性可取值可赋值 2.文本onchange事件 3.form及form中控件通过name访问元素 二. ...
- amazeui中的js插件有哪些(详解功能)
amazeui中的js插件有哪些(详解功能) 一.总结 一句话总结: 二.amazeui中的js插件有哪些 1.UI 增强 警告框Alert 按钮交互Button 折叠面板Collapse 下拉组件D ...