TCP、UDP、IP报头结构体分析

2023-11-08

TCP、UDP、IP报头结构体分析
 
TCP数据段格式    
      TCP是一种可靠的、面向连接的字节流服务。源主机在传送数据前需要先和目标主机建立连接。然后,在此连接上,被编号的数据段按序收发。同时,要求对每个数据段进行确认,保证了可靠性。如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。 下图为TCP头部结构:

  ●源、目标端口号字段:各占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字,但是这些端口号已经被分为公认端口、注册端口和动态/私有端口,这个划分详见下一篇博文。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。
  ●顺序号字段:占32比特。用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。
  在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP标准推荐使用以4ms间隔递增1的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。
  对于那些包含数据的报文段,报文段中第一个数据字节的数量就是初始序列号,其后数据字节按顺序编号。如果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么第二个报文段的序列号就是1100(1000+100),第三个报文段的序列号就是1200(1100+100)。如果序列号增大至最大值将复位为0。    
  ●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。目的主机返回确认号,使源主机知道某个或几个报文段已被接收。如果ACK控制位被设置为1,则该字段有效。确认号等于顺序接收到的最后一个报文段的序号加1(建立连接时)或者加上一份数据的大小(数据传输时),这也是目的主机希望下次接收的报文段的序号值。返回确认号后,计算机认为已接收到小于该确认号的所有数据。
  例如,序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么接收到第一个报文段后,目的主机返回含确认号1100的报头。接收到第二个报文段(其序号为1100)后,目的主机返回确认号1200。接收到第三个报文段后,目的主机返回确认号1300。
  目的主机不一定在每次接收到报文段后都返回确认号。在上面的例子中,目的主机可能等到所有3个报文段都收到后,再返回一个含确认号1300的报文段,表示已接收到全部1200字节的数据。但是如果目的主机再发回确认号之前等待时间过长,源主机会认为数据没有到达目的主机,并自动重发。
  上面的例子中,如果目的主机接收到了报文段号为1000的第一个报文段以及报文段号为1200的最后一个报文段,则可返回确认号1100,但是再返回确认号1300之前,应该等待报文段号为1100的中间报文段。    
  ●头部长度字段:占4比特。给出头部占32比特的数目。由于TCP报头的长度随TCP选项字段内容的不同而变化,因此报头中包含一个指定报头字段的字段。该字段以32比特为单位,所以报头长度一定是32比特的整数倍,有时需要在报头末尾补0。如果报头没有TCP选项字段,则报头长度值为5,表示报头一个有160比特,即20字节。    
  ●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:    
  >>> URG:报文段紧急。    
  >>> ACK:确认序号有效。    
  >>> PSH:接收方应该尽快将这个报文段交给应用层。    
  >>> RST:重建连接。    
  >>> SYN:发起一个连接。在握手完成后SYN为1,表示TCP建立已连接。此后的所有报文段中,SYN都被置0。
  >>> FIN:释放一个连接。如果源主机数据发送完毕,将把该连接下要发送的最后一个报文段的报头中的FIN位置1,或将该报文段后面发送的报头中该位置1。    
  ●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。接收计算机可接收的新数据字节的数量,根据接收缓冲区可用资源的大小,其值随计算机所发送的每个报文段而变化。源主机可以利用接收到的窗口值决定下一个报文段的大小。   
  ●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。    
  ●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。如果URG为1,则紧急指针标志着紧急数据的结束。其值是紧急数据最后1字节的序号,表示报文段序号的偏移量。例如,如果报文段的序号是1000,前8个字节都是紧急数据,那么紧急指针就是8。紧急指针一般用途是使用户可中止进程。    
  ●选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。
  ●数据部分:报头后面是可选的报文段数据部分。IP协议标准要求株距能接收最长达576字节的数据报。无其他选项的IP报头是20字节,无其他选项的TCP报头也是20字节,所以IP选项和TCP选项且含有多达536字节数据的TCP报文段无须分片就可达到目的主机。

UDP数据段格式    
    UDP是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下,UDP比TCP更加高效。   
下图为UDP的头部结构:  

  ●源、目标端口号字段:占16比特。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。    
  ●长度字段:占16比特。标明UDP头部和UDP数据的总长度字节。    
  ●校验和字段:占16比特。用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的

IP报文段格式
下图为IP的头部结构:

    普通的 IP 头部长度为20 个字节,不包含IP 选项字段。
  ●版本号(Version):标明了IP 协议的版本号,目前的协议版本号为4。下一代IP 协议的版本号为6。
  ●报文长度:指 IP 包头部长度,占4 位。
  ●8 位的服务类型:包括一个3 位的优先权字段(COS,Class of Service),4 位TOS 字段和1 位未用位。4 位TOS 分别代表最小时延、最大吞吐量、最高可靠性和最小费用。
  ●总长度:是整个IP 数据报长度,包括数据部分。
  ●标识符:唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
  ●生存时间:设置了数据包可以经过的路由器数目。一旦经过一个路由器,TTL 值就会减1,当该字段值为0 时,数据包将被丢弃。
  ●协议:确定在数据包内传送的上层协议,和端口号类似,IP 协议用协议号区分上层协议。TCP 协议的协议号为6,UDP 协议的协议号为17。
  ●报头校验和:计算IP 头部的校验和,检查报文头部的完整性。
  ●源IP 地址和目的IP 地址字段:标识数据包的源端设备和目的端设备。

  ●IP选项:一般格式为1个字节的代码,一个字节的长度,一个字节的指针,指针的值从1开始计数,指向IP选项的内容,一般其值为4(跳过了前面的代码&长度&指针的三个字节),长度包括前面3个字节在内的整个IP选项,最大值为40。

注:正常IP包的包头长度标志位(第0x000E字节)的值都是0x45,其中高位“4”表示该IP包的版本号为4(IP v4),低位“5”表示包头长5个32位组(即20字节)。

以太网的帧格式如下所示

image

其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。类型字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码。

以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。ifconfig命令的输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP、UDP、IP报头结构体分析 的相关文章

  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Go TCP 读取是非阻塞的

    我正在尝试用 Go 创建服务器和客户端 我已经成功地与服务器和客户端进行通信 但我遇到的问题是golang中的TCP读取是非阻塞的 我想知道 golang 中的读取是否有可能像 C 中的读取一样阻塞 谢谢 EDIT 这是服务器的源代码 fu
  • 在Servlet中获取真实的客户端IP [重复]

    这个问题在这里已经有答案了 我在一个简单的问题上遇到了一些麻烦 我会得到HTTPServlet 内的真实客户端 IP 从现在开始我使用 request getRemoteAddr 但现在它返回一个错误的IP 例如 xxx xxx xxx 5
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • 如何在java应用程序中检测FIN - tcp标志?

    我在两台计算机之间有持久的 TCP 连接 第二台计算机不受我的控制 第二台计算机可以随时发送FIN标志 并且首先必须关闭当前连接 将FIN标志发送回第二台计算机 我如何知道第二台计算机正在发送 FIN 标志 以及何时必须调用 Java 应用
  • 在 Python 中通过 TCP 套接字发送文件

    我已经成功地将文件内容 图像 复制到新文件 然而 当我通过 TCP 套接字尝试同样的事情时 我遇到了问题 服务器循环未退出 客户端循环在到达 EOF 时退出 但服务器无法识别 EOF 这是代码 Server import socket Im
  • 使用 STUN 打孔

    我目前正在尝试通过 Internet 发送 UDP 消息 并且必须为端点 A 和 B 都位于 NAT 后面 设置防火墙 为此 我想使用 STUN 服务器进行打孔 当 A 创建对 STUN 服务器的请求 例如 私有 85 1 1 12 600
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 在 PowerShell 中通过 UDP 发送和接收数据

    我正在尝试编写一个脚本来使用 PowerShell 进行测试和应用 测试应包括通过 UDP 向远程服务器发送字符串 然后读取该服务器的响应并对结果执行某些操作 我需要的唯一帮助是脚本的中间两个步骤 发送字符串 然后 接收响应 在端口 UDP
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 获取2个IP地址之间的地理距离? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何计算 2 个 IP 地址之间的地理距离 例如 500 英里 有没有一些API可以让你查这个 这可能是您将得到的最接近的结果 谁提供 WH
  • 如何强制关闭 TcpListener

    我有一个通过 tcpListener 进行通信的服务 问题是当用户重新启动服务时 抛出 地址已在使用 异常 并且服务在几分钟左右无法启动 有没有办法告诉系统终止旧连接 以便我可以打开一个新连接 我不能只使用随机端口 因为服务无法通知客户端端
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我

随机推荐

  • 自然语言处理技术之词向量:GloVe单词表示的全局向量(glove.840B.300d、glove.6B)

    目录 一 词向量介绍 二 GloVe学习词向量的词嵌入模型 三 词向量入门 代码下载 四 训练 五 模型概述 六 可视化 七 发布历史 一 词向量介绍 自然语言处理 NLP 中的词向量是将文本中的词汇表示为数值向量的技术 词向量的主要作用是
  • 物理机服务器应该注意的事

    物理机服务器应该注意的事 1 选址 服务器是个非常重要的硬件产品 对机房的也是有一定的要求的 比如温度 安全性 噪音 电源稳定性等等问题都需要解决 但是不是每个人都会选择自己建立一个机房 毕竟各方面加起来的成本都太高 这个时候可以选择一个专
  • @SpringBootApplication 相当于 @Configuration、@EnableAutoConfiguration 、 @ComponentScan 三个的作用

    ComponentScan 如果不设置basePackage的话 默认会扫描包的所有类 所以最好还是写上basePackage 减少加载时间 默认扫描 class路径 比如这个注解在com wuhulala 下面 那么会扫描这个包下的所有类
  • pycharm安装opencv-python失败的手动解决办法

    解决方法 直接将opencv python文件下载到本地 把文件放到对应pycharm项目的Lib site packages路径下 在这里分享window系统的opencv python文件下载链接 链接 https pan baidu
  • ACC测试理论--google软件测试之道

    ACC测试理论 A Attribute 特质 在测试之前 需了解产品的特质是什么 即客户为何需要选择此产品的原因 Chrome的定位是快速 安全 稳定和优雅 特质所拥有的特点如下 简单 如果你不能几分钟内列举出来 说明你还没有足够理解你的产
  • CMake添加gcov代码覆盖测试支持

    CMake添加gcov代码覆盖测试支持 金庆的专栏 在根CMakeList txt中添加ENABLE GCOV选项 OPTION ENABLE GCOV Enable gcov debug Linux builds only OFF IF
  • 基数排序python

    一 基数排序介绍 基数排序 radix sort 属于 分配式排序 distribution sort 又称 桶子法 bucket sort 或bin sort 顾名思义 它是透过键值的部份资讯 将要排序的元素分配至某些 桶 中 藉以达到排
  • Shopify速度优化

    对于很多出海的商家 网站速度的加载快慢一直是大家困扰的问题 首先我们先认识下什么是网站速度和网页速度 网站速度是用户浏览网站时的网站加载速度 从第一页加载到访客点入浏览 最后在购物车页面 结账 这个速度由一些服务来评分 例如 Google
  • Influxdb 1.2版本优化之旅(经验证,适用于influxdb1.4版本)

    一 常见异常 1 max series per database exceeded 异常 err max series per database exceeded java lang RuntimeException error max s
  • c#与matlab混合编程解决线性规划,非线性规划(二次规划)等问题

    网上已经有很多类似方法 上一篇是Lingo 本篇是matlab 两个软件在解决最优解方面各有优势 matlab软件中自带许多函数 1 非线性规划 x fval fmincon fun x0 A b Aeq beq lb ub nonlcon
  • vscode react代码提示和补全

    无代码提示 安装代码提示插件Reactjs code snippets 按ctrl 进入设置界面 输入 tag usesOnlineServices 勾选 JSX html无自动补全 按ctrl 进入设置界面 搜索框中输入Include L
  • emoji表情大全

    emoji表情 emoji人物 emoji手势 emoji日常 emoji手机 emoji公共 emoji动物
  • 介绍一个很爽的 php 字符串特定检索函数---strpos()

    大家在用 php 开发的时候 是否 有遇到过 对于一个获取的字符串 如果想要特定检测它是否 含有某个特定的字符或者子字符串 总是找不到好方法 或者根本做不到 迫于无奈而使用foreach 函数 strpos 参数1 待检索的字符串或字符串变
  • Activity启动流程

    简述 Activity 启动分为两种 1 Activity中通过startActivity 方法启动一个Activity 2 从桌面通过点击应用图标启动一个App然后显示Activity 我们通过第二点来分析 更全面一点 先走一波流程图 以
  • 周志华《Machine Learning》学习笔记(17)--强化学习

    上篇主要介绍了概率图模型 首先从生成式模型与判别式模型的定义出发 引出了概率图模型的基本概念 即利用图结构来表达变量之间的依赖关系 接着分别介绍了隐马尔可夫模型 马尔可夫随机场 条件随机场 精确推断方法以及LDA话题模型 HMM主要围绕着评
  • ARM平台移植 openssl-1.1.0

    系统环境 Ubuntu 14 04 3 LTS 源码 openssl 1 1 0 pre1 tar gz 交叉编译环境 arm none linux gnueabi zhaojq virtual machine tar xzvf opens
  • gta5老是变成单人战局_《GTA5》为什么战局总是突然全部人都退出了?!

    不朽的传说猴哥 网络不好 我有时候也是 发布于 2020 04 13 01 46 45 不朽的传说猴哥 网络不好 我有时候也是 发布于 2020 04 13 01 46 45 不朽的传说猴哥 网络不好 我有时候也是 发布于 2020 04
  • 工作三年,你的存款有多少?统计出来的结果令人扎心

    最近看到一个粉丝给我留言 一个毕业三年的人 应该有多少存款 据我所知 身边大部分年轻人的存款都很少 如果你去问他们存款有多少 得到的答案很有可能是为零 甚至有很多人的存款是负数 每月工资到手就得拿去填各种窟窿 上千的房租 大几千的生活费 还
  • iOS中的autorelease

    iOS中的autorelease是一种非常重要的内存管理机制 它可以自动释放对象 从而避免内存泄漏和内存溢出等问题 在本文中 我们将详细介绍iOS中的autorelease机制 包括它的原理 使用方法以及注意事项等内容 autoreleas
  • TCP、UDP、IP报头结构体分析

    TCP UDP IP报头结构体分析 TCP数据段格式 TCP是一种可靠的 面向连接的字节流服务 源主机在传送数据前需要先和目标主机建立连接 然后 在此连接上 被编号的数据段按序收发 同时 要求对每个数据段进行确认 保证了可靠性 如果在指定的