TCP和IP数据包结构

一、问题引入 

一般我们在谈上网速度的时候,专业上用带宽来描述,其实无论说网速或者带宽都是不准确的,呵呵。比如:1兆,512K……有些在学校的学生,也许会有疑问,明明我的业务是1M,为什么下载速度到100K就飙不上去了?512K的为什么50多K就封顶了?…

这里所说的1M是指1Mbps = 1 Million Bits Per Second,也就是1M比特每秒,即一秒钟传输1048576个二进制位。我们知道一个字节是8个二进制位。

好,又来问题了。即便这样子,1M=1048756÷8=131072÷1024=128K。那也应该有128K啊,为什么下载速度还是很少到120K,110K都谢天谢地了。看完本文,你的帐就对了……

二、IP数据包结构

1-1.版本4位,表示版本号,目前最广泛的是4=B1000,即常说的IPv4;相信IPv6以后会广泛应用,它能给世界上每个纽扣都分配一个IP地址。

1-2.头长4位,数据包头部长度。它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(红色部分)。

1-3.服务类型,包括8个二进制位,每个位的意义如下:

       过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)

       延迟字段:1位,取值:0(正常)、1(期特低的延迟)

       流量字段:1位,取值:0(正常)、1(期特高的流量)

       可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

       成本字段:1位,取值:0(正常)、1(期特最小成本)

       保留字段:1位 ,未使用

1-4.包裹总长16位,当前数据包的总长度,单位是字节。当然最大只能是65535,及64KB。

2-1.重组标识16位,发送主机赋予的标识,以便接收方进行分片重组。

2-2.标志3位,他们各自的意义如下:

       保留段位(2):1位,未使用

       不分段位(1):1位,取值:0(允许数据报分段)、1(数据报不能分段)

       更多段位(0):1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)

2-3.段偏移量13位,与更多段位组合,帮助接收方组合分段的报文,以字节为单位。

3-1.生存时间8位,经常ping命令看到的TTL(Time To Live)就是这个,每经过一个路由器,该值就减一,到零丢弃。

3-2.协议代码8位,表明使用该包裹的上层协议,如TCP=6,ICMP=1,UDP=17等。

3-3.头检验和16位,是IPv4数据包头部的校验和。

4-1.源始地址,32位4字节,我们常看到的IP是将每个字节用点(.)分开,如此而已。

5-1.目的地址,32位,同上。

6-1.可选选项,主要是给一些特殊的情况使用,往往安全路由会当作攻击而过滤掉,普联(TP_LINK)的TL-ER5110路由就能这么做。

7-1.用户数据。

IP头部字段解释

  1. 版本(Version)

    • 位置:第0到3位
    • 长度:4位
    • 作用:表示IP协议的版本。IPv4的版本号为4,IPv6的版本号为6。
  2. 头长(Header Length, IHL)

    • 位置:第4到7位
    • 长度:4位
    • 作用:表示IP头部的长度,以32位(4字节)为单位。最小值为5,表示20字节的头部。
  3. 服务类型(Type of Service, TOS)

    • 位置:第8到15位
    • 长度:8位
    • 作用:用于指定数据包的优先级和服务质量(QoS),如延迟、吞吐量、可靠性等。
  4. 总长度(Total Length)

    • 位置:第16到31位
    • 长度:16位
    • 作用:表示整个IP数据包(包括头部和数据)的长度,以字节为单位。
  5. 标识(Identification)

    • 位置:第32到47位
    • 长度:16位
    • 作用:用于唯一标识主机发送的每一个数据包,特别是在数据包分片时用于重组数据包。
  6. 标志(Flags)

    • 位置:第48到50位
    • 长度:3位
    • 作用:控制或标识数据包的分片情况,包括是否可以分片(DF标志)以及更多分片(MF标志)。
  7. 段偏移量(Fragment Offset)

    • 位置:第51到63位
    • 长度:13位
    • 作用:用于标识数据包分片的位置,用于重组分片。
  8. 生存时间(Time to Live, TTL)

    • 位置:第64到71位
    • 长度:8位
    • 作用:表示数据包在网络中可以经过的最大路由数,防止数据包在网络中无限循环。
  9. 协议(Protocol)

    • 位置:第72到79位
    • 长度:8位
    • 作用:标识数据部分所使用的传输层协议(例如TCP为6,UDP为17)。
  10. 头部校验和(Header Checksum)

    • 位置:第80到95位
    • 长度:16位
    • 作用:用于校验头部数据的完整性,确保数据包在传输过程中未被篡改。
  11. 源地址(Source Address)

    • 位置:第96到127位
    • 长度:32位
    • 作用:表示数据包发送方的IP地址。
  12. 目的地址(Destination Address)

    • 位置:第128到159位
    • 长度:32位
    • 作用:表示数据包接收方的IP地址。
  13. 可选项(Options)

    • 位置:第160位开始,可变长度
    • 作用:包含用于控制和调试的附加信息(可选),长度可变。
  14. 填充(Padding)

    • 位置:可选字段之后
    • 作用:填充使得IP头部长度是4字节的整数倍。
  15. 用户数据(Data)

    • 位置:IP头部之后
    • 作用:实际传输的用户数据。

三、TCP数据包结构

1-1.源始端口16位,范围当然是0-65535啦。

1-2.目的端口,同上。

2-1.数据序号32位,TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号。

3-1.确认序号32位,为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号。

4-1.偏移4位,类似IP,表明数据距包头有多少个32位。

4-2.保留6位,未使用,应置零。

4-3.紧急比特URG—当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

4-3.确认比特ACK—只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。参考TCP三次握手

4-4.复位比特RST(Reset) —当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。参考TCP三次握手

4-5.同步比特SYN—同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。参考TCP三次握手

4-6.终止比特FIN(FINal)—用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

4-7.窗口字段16位,窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。

5-1.包校验和16位,包括首部数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

6-1.可选选项24位,类似IP,是可选选项。

6-2.填充8位,使选项凑足32位。

7-1.用户数据……

可以看出,每个IP包至少要20字节的头部长度,这些与下载内容无关,加上目前多数传输,包括http协议(就是IE直接下载),都是基于TCP协议的,所以IP包裹还要从用户数据中扣除20字节的TCP包头,这里已经是40字节,加上其他程序的连接,状态确认等等包裹,因而算出来要比理论值要小。

另外网络环境(包括稳定因素和传输节点的转发率)也是影响下载速度的重要原因……

TCP头部字段解释

  1. 源端口(Source Port)

    • 位置:第0到15位
    • 长度:16位
    • 作用:表示发送端的端口号,用于标识发送方应用程序。
  2. 目的端口(Destination Port)

    • 位置:第16到31位
    • 长度:16位
    • 作用:表示接收端的端口号,用于标识接收方应用程序。
  3. 序列号(Sequence Number)

    • 位置:第32到63位
    • 长度:32位
    • 作用:用于数据重组和排序,标识发送的数据字节流中的位置。
  4. 确认号(Acknowledgment Number)

    • 位置:第64到95位
    • 长度:32位
    • 作用:用于确认已收到的数据,表示接收方期望收到的下一个字节的序号。
  5. 偏移(Data Offset)

    • 位置:第96到99位
    • 长度:4位
    • 作用:表示TCP头部的长度,以32位(4字节)为单位,最小值为5(20字节)。
  6. 保留(Reserved)

    • 位置:第100到103位
    • 长度:4位
    • 作用:保留为将来使用,通常设置为0。
  7. 标志位(Flags)

    • 位置:第104到111位,共8位
      • U(URG):紧急指针有效
      • A(ACK):确认序号有效
      • P(PSH):接收方应尽快将数据推送给应用层
      • R(RST):重置连接
      • S(SYN):同步序号,用于建立连接
      • F(FIN):表示发送方已发送完数据,关闭连接
  8. 窗口大小(Window Size)

    • 位置:第112到127位
    • 长度:16位
    • 作用:用于流量控制,表示接收方的接收窗口大小。
  9. 校验和(Checksum)

    • 位置:第128到143位
    • 长度:16位
    • 作用:用于验证TCP头部和数据的完整性。
  10. 紧急指针(Urgent Pointer)

    • 位置:第144到159位
    • 长度:16位
    • 作用:如果URG标志位设置,则此字段表示紧急数据的结束位置。
  11. 可选字段(Options)

    • 位置:第160位开始
    • 长度:可变,最长可达40字节
    • 作用:用于扩展TCP协议功能,例如时间戳、窗口缩放因子等。
  12. 填充(Padding)

    • 位置:可选字段之后
    • 作用:填充使得TCP头部长度是4字节的整数倍。
  13. 数据(Data)

    • 位置:TCP头部之后
    • 作用:实际传输的用户数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机(STC8051U34K64)_RA8889_SPI4参考代码(v1.3)

硬件:STC8051U34K64 RA8889开发板(硬件跳线变更为SPI-4模式,PS101,R143,R141短接,R142不接) STC8051U34K64是STC最新推出来的单片机,主要用于替换传统的8051单片机,与标…

程序员学长 | 快速学习一个算法,GAN

本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。 原文链接:快速学习一个算法,GAN GAN 如何工作? GAN 由两个部分组成:生成器(Generator)和判别器&…

从0开始基于transformer进行股价预测(pytorch版本)

目录 数据阶段两个问题开始利用我们的代码进行切分 backbone网络训练效果 感觉还行,没有调参数。源码比较长,如果需要我后续会发(因为太长了!!) 数据阶段 !!!注意&#…

还不懂 OOM ?详解内存溢出与内存泄漏区别!

内存溢出与内存泄漏 1. 内存溢出(Out Of Memory,OOM) 概念: 内存溢出是指程序在运行过程中,尝试申请的内存超过了系统所能提供的最大内存限制,并且垃圾收集器也无法提供更多的内存,导致程序无…

# Redis 入门到精通(一)数据类型(3)

Redis 入门到精通(一)数据类型(3) 一、redis 数据类型–set 类型介绍与基本操作 1、set 类型 新的存储需求: 存储大量的数据,在查询方面提供更高的效率。需要的存储结构: 能够保存大量的数据,高效的内部…

【爬虫】解析爬取的数据

目录 一、正则表达式1、常用元字符2、量词3、Re模块4、爬取豆瓣电影 二、Xpath1、Xpath解析Ⅰ、节点选择Ⅱ、路径表达式Ⅲ、常用函数 2、爬取豆瓣电影 解析数据,除了前面的BeautifulSoup库,还有正则表达式和Xpath两种方法。 一、正则表达式 正则表达式…

C++|智能指针

目录 引入 一、智能指针的使用及原理 1.1RAII 1.2智能指针原理 1.3智能指针发展 1.3.1std::auto_ptr 1.3.2std::unique_ptr 1.3.3std::shared_ptr 二、循环引用问题及解决方法 2.1循环引用 2.2解决方法 三、删除器 四、C11和boost中智能指针的关系 引入 回顾上…

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一,使用逆向工程步骤梳理1,修改逆向工程的application.yml配置2,修改逆向工程的generator.properties配置3,以Debug模式启动逆向工程4,使用逆向工程生成代码5,整合生成的代码到对应的模块中 二&am…

VMware Workstation 虚拟机网络配置为与主机使用同一网络

要将 VMware Workstation 虚拟机网络配置为与主机使用同一网络,我们需要将虚拟机的网络适配器设置为桥接模式。具体步骤如下: 配置 VMware Workstation 虚拟机网络为桥接模式 打开 VMware Workstation: 启动 VMware Workstation。 选择虚拟机…

实验场:在几分钟内使用 Bedrock Anthropic Models 和 Elasticsearch 进行 RAG 实验

作者:来自 Elastic Joe McElroy, Aditya Tripathi 我们最近发布了 Elasticsearch Playground,这是一个新的低代码界面,开发人员可以通过 A/B 测试 LLM、调整提示(prompt)和分块数据来迭代和构建生产 RAG 应用程序。今天…

Web3学习路线图,从入门到精通

前面我们聊了Web3的知识图谱,内容是相当的翔实,要从哪里入手可以快速的入门Web3,本篇就带你看看Web3的学习路线图,一步一步深入学习Web3。 这张图展示了Web3学习路线图,涵盖了区块链基础知识、开发方向、应用开发等内…

接上一回C++:补继承漏洞+多态原理(带图详解)

引子:接上一回我们讲了继承的分类与六大默认函数,其实继承中的菱形继承是有一个大坑的,我们也要进入多态的学习了。 注意:我学会了,但是讲述上可能有一些不足,希望大家多多包涵 继承复习: 1&…

windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

说明: 该文档适用于  首次/重新 搭建3D-Slicer工程环境  Clean up(非增量) 编译生成 1. 3D-slicer 软件介绍 (1)3D Slicer为处理MRI\CT等图像数据软件,可以实行基于MRI图像数据的目标分割、标记测量、坐标变换及三维重建等功能,其源于3D slicer 4.13.0-2022-01-19开…

OS Copilot测评

1.按照第一步管理重置密码时报错了,搞不懂为啥?本来应该跳转到给的那个实例的,我的没跳过去 2.下一步重置密码的很丝滑没问题 3安全组新增入库22没问题 很方便清晰 4.AccessKey 还能进行预警提示 5.远程连接,网速还是很快,一点没卡,下载很棒 6.替换的时候我没有替换<>括…

【JavaEE】网络编程——UDP

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; 文章目录 1.数据报套接字(UDP)1.1特点1.2编码1.2.1DatagramSocket1.2.2DatagramPacket…

Spring Cloud Alibaba AI 介绍及使用

一、Spring Cloud Alibaba AI 介绍 Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。而 Spring Cloud Alibaba AI 是阿里以 Spring AI 为基础&#xff0c;并在此基础上提供…

dive deeper into tensor:从底层开始学习tensor

inspired by karpathy/micrograd: A tiny scalar-valued autograd engine and a neural net library on top of it with PyTorch-like API (github.com)and Taking PyTorch for Granted | wh (nrehiew.github.io). 这属于karpathy的karpathy/nn-zero-to-hero: Neural Networks…

阐述 C 语言中的参数传递机制

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

多表查询sql

概述&#xff1a;项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系&#xff0c;分为三种&#xff1a; 一对多多对多一对一 一、多表关系 一对多 案例&#xff1a;部门与…

【PowerShell】-1-快速熟悉并使用PowerShell

目录 PowerShell是什么&#xff1f;和CMD的区别&#xff1f; PowerShell的演变 自动化IT管理任务 一些名词 详尽的PowerShell开始之路 1.打开PowerShell&#xff1a; 2.基本命令&#xff1a; &#xff08;1&#xff09;Get-Process &#xff08;2&#xff09;变量赋值…