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.rhkb.cn/news/369890.html

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

相关文章

前后端的导入、导出、模板下载等写法

导入,导出、模板下载等的前后端写法 文章目录 导入,导出、模板下载等的前后端写法一、导入实现1.1 后端的导入1.2 前端的导入 二、基础的模板下载2.1 后端的模板下载-若依基础版本2.2 前端的模板下载2.3 后端的模板下载 - 基于资源文件读取2.4 excel制作…

Tech Talk:智能电视eMMC存储的五问五答

智能电视作为搭载操作系统的综合影音载体,以稳步扩大的市场规模走入越来越多的家庭,成为人们生活娱乐的重要组成部分。存储部件是智能电视不可或缺的组成部分,用于保存操作系统、应用程序、多媒体文件和用户数据等信息。智能电视使用eMMC作为…

ListBox自动滚动并限制显示条数

1、实现功能 限制ListBox显示的最大条数; ListBox自动滚动,显示最新行; 2、C#代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using Syst…

印尼网络安全治理能力观察

在全国国际机场的移民服务完全瘫痪 100 多个小时后,印尼政府承认其新成立的国家数据中心 (PDN) 遭受了网络攻击。 恶意 Lockbit 3.0 勒索软件加密了存储在中心的重要数据,其背后的黑客组织要求支付 800 万美元的赎金。 不幸的是,大多数数据…

TreeMap、HashMap 和 LinkedHashMap 的区别

TreeMap、HashMap 和 LinkedHashMap 的区别 1、HashMap2、LinkedHashMap3、TreeMap4、总结 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,TreeMap、HashMap 和 LinkedHashMap 是三种常用的集合类,它们在…

01 Web基础与HTTP协议

1、域名和DNS 1.1 域名的概念 如果说一个主机,没有名字也可以完全用IP来代替,但是IP地址不好记忆。例如说,我们记一些网站的名称百度、新浪、搜狐等很好记,但是如果要去记百度的IP、新浪的IP、以及搜狐的IP地址,那将会…

LeetCode题练习与总结:排序链表--148

一、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3&am…

iptables与firewalld

iptables Linux上常用的防火墙软件 1、 防火墙的策略 防火墙策略一般分为两种,一种叫通策略,一种叫堵策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身…

leetcode力扣_贪心思想

455.分发饼干(easy-自己想得出来并写好) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺…

无人机便携式侦测干扰设备(定全向)技术详解

无人机便携式侦测干扰设备(定全向)是一种专门针对无人机进行侦测和干扰的设备。它具备定向和全向两种工作模式,能够覆盖较宽的频率范围,有效侦测并干扰无人机与遥控器之间的通信信号,从而达到控制或驱离无人机的目的。…

小酌消烦暑|人间正清欢

小暑是二十四节气之第十一个节气。暑,是炎热的意思,小暑为小热,还不十分热。小暑虽不是一年中最炎热的时节,但紧接着就是一年中最热的节气大暑,民间有"小暑大暑,上蒸下煮"之说。中国多地自小暑起…

Qt 基础组件速学 鼠标和键盘事件

学习目标: 鼠标事件和键盘事件应用 前置环境 运行环境:qt creator 4.12 学习内容和效果演示: 1.鼠标事件 根据鼠标的坐标位置,做出对应的事件。 2.键盘事件 根据键盘的输入做出对应操作 详细主要代码 1.鼠标事件 #include "main…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出,MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询,第一个会列…

windows启动Docker闪退Docker desktop stopped

Windows启动Docker闪退-Docker desktop stopped 电脑上很早就安装有Docker了,但是有一段时间都没有启动了,今天想启动启动不起来了,打开没几秒就闪退,记录一下解决方案。仅供参考 首先,参照其他解决方案,本…

【Python系列】数字的bool值

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

JAVA每日作业day7.4

ok了家人们今天学习了Date类和simpleDateformat类,话不多说我们一起看看吧 一.Date类 类 java.util.Date 表示特定的瞬间 ( 日期和时间 ) ,精确到毫秒。 1.2 Date类的构造方法 public Date(): 用来创建当前系统时间对应的日期对象。 public Date(long …

Linux系统(CentOS)安装iptables防火墙

1,先检查是否安装了iptables 检查安装文件-执行命令:rpm -qa|grep iptables 检查安装文件-执行命令:service iptables status 2,如果安装了就卸装(iptables-1.4.21-35.el7.x86_64 是上面命令查出来的版本) 执行命令&#xff1a…

【高性能服务器】多进程并发模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 对于常见的C/S模型…

spark on k8s两种方式的原理与对比

spark on k8s两种方式的原理与对比 1、spark on k8s 方式 spark-submit可以直接用来向 Kubernetes 集群提交 Spark 应用,提交机制如下: 1、Spark 创建一个在Kubernetes pod中运行的 Spark 驱动程序。 2、驱动程序创建在 Kubernetes Pod 中运行的执行器…

JAVA基础知识(上)

# 一、说说&和&&的区别? 作为运算符:& 将二进制的每一位进行与运算 作为逻辑运算符:两者都是与,&& 如果左边为假则终止右边运算,即短路运算。& 则需要把两边的比较执行完 # 二、int和Integer的区…