转自: https://blog.51cto.com/lyhbwwk/2162568

一、IP包格式

  IP数据包是一种可变长分组,它由首部和数据负载两部分组成。首部长度一般为20-60字节(Byte),其中后40字节是可选的,长度不固定,前20字节格式为固定。数据负载部分的长度一般可变,整个IP数据包的最大长度为65535B。

1、版本号(Version)

    长度为4位(bit),IP v4的值为0100,IP v6的值为0110。

2、首部长度

  指的是IP包头长度,用4位(bit)表示,十进制值就是[0,15],一个IP包前20个字节是必有的,后40个字节根据情况可能有可能没有。如果IP包头是20个字节,则该位应是20/4=5。

3、服务类型(Type of Service  TOS)

  长度为8位(bit),其组成:前3位为优先级(Precedence),后4位标志位,最后1位保留未用。优先级主要用于QoS,表示从0(普通级别)到7(网络控制分组)的优先级。标志位可分别表示D(Delay更低的时延)、T(Throughput 更高的吞吐量)、R(Reliability更高的可靠性)、C(Cost 更低费用的路由)。

    TOS只表示用户的请求,不具有强制性,实际应用中很少用,路由器通常忽略TOS字段。

4、总长度(Total Length)

  指IP包总长度,用16位(bit)表示,即IP包最大长度可以达216=65535字节。在以太网中允许的最大包长为1500B,当超过网络允许的最大长度时需将过长的数据包分片。

5、标识符(Identifier)

  长度为16位,用于数据包在分段重组时标识其序列号。将数据分段后,打包成IP包,IP包因走的路由上不同,会产生不同的到达目地的时间,到达目地的后再根据标识符进行重新组装还原。该字段要与标志、段偏移一起使用的才能达到分段组装的目标。

6、标志(Flags)

  长度为3位,三位从左到右分别是MF、DF、未用。MF=1表示后面还有分段的数据包,MF=0表示没有更多分片(即最后一个分片)。DF=1表示路由器不能对该数据包分段,DF=0表示数据包可以被分段。

7、偏移量(Fragment Offset)

  也称段偏移,用于标识该数据段在上层初始数据报文中的偏移量。如果某个包含分段的上层报文的IP数据包在传送时丢失,则整个一系列包含分段的上层数据包的IP包都会要求重传。

8、生存时间(TTL)

  长度为8位,初始值由操作系统设置,每经过一个路由器转发后其值就减1,减至0后丢弃该包。这种机制可以避免数据包找不到目地时不断被转发,堵塞网络。

9、协议(Protocol)

    长度为8位,标识上层所使用的协议。

10、首部校验和(Header Checksum)

  长度为16位,首部检验和只对IP数据包首部进行校验,不包含数据部分。数据包每经过一个中间节点都要重新计算首部校验和,对首都进行检验。

11、源IP地址(Source IP)

    长度为32位,表示数据发送的主机IP。

12、目的IP地址(Destination IP)

    长度为32位,表示数据要接收的主机IP。

13、选项字段(Options)

  长度为0-40字节(Byte),主要有:安全和处理限制(Security)、记录路径(Record Route)、时间戳(Timestamps)、宽松源站选路(Loose Source Routing)、严格的源站选路(Strict Source Routing)等。

二、TCP报文

  TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。

  因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。

  TCP报文中数据部分是可选的,即TCP报文可以不包含数据(同理IP包也可以不包含数据)。不含数据的TCP报文通常是一些确认和控制信息类的报文,如TCP建立连接时的三次握手和TCP终止时的四次挥手等。

1、源端口号(Source Port)

    长度为16位,指明发送数据的进程。

2、目的端口号(Destination Port)

    长度为16位,指明目的主机接收数据的进程。

3、序号(Sequence Number)

  也称为序列号,长度为32位,序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,可以理解成对字节流的计数。

4、确认号(Acknowledgement Number)

  长度为32位,确认号包含发送确认的一端所期望收到的下一个序号。确认号只有在ACK标志为1时才有效。

5、首部长度

  长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5。

6、保留位(Reserved)

    长度为6位,必须是0,它是为将来定义新用途保留的。

7、标志(Code Bits)

    长度为6位,在TCP报文中不管是握手还是挥手还是传数据等,这6位标志都很重要。6位从左到右依次为:

      • URG:紧急标志位,说明紧急指针有效;

      • ACK:确认标志位,多数情况下空,说明确认序号有效;

      • PSH:推标志位,置位时表示接收方应立即请求将报文交给应用层;

      • RST:复位标志,用于重建一个已经混乱的连接;

      • SYN:同步标志,该标志仅在三次握手建立TCP连接时有效

      • FIN:结束标志,带该标志位的数据包用于结束一个TCP会话。

8、窗口大小(Window Size)

    长度为16位,TCP流量控制由连接的每一端通过声明的窗口大小来提供。

9、检验和(Checksum)

  长度为16位,该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。

10、紧急指针(Urgent Pointer)

    长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。

11、选项(Options)

  长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。通常包含:最长报文大小(MaximumSegment Size,MSS)、窗口扩大选项、时间戳选项、选择性确认(Selective ACKnowlegement,SACK)等。

12、数据

三、UDP数据段

  UDP数据段格式比较简单,如下:

  UDP数据报由首部和数据两部分组成,其中首部只有8B(字节)。

1、源端口号(Source Port)

    长度为16位,指明发送数据的进程。

2、目的端口号(Destination Port)

    长度为16位,指明目的主机接收数据的进程。

3、长度

    长度为16位,该字段值为报头和数据两部分的总字节数。

4、检验和(Checksum)

    长度为16位,UDP检验和作用于UDP报头和UDP数据的所有位。由发送端计算和存储,由接收端校验。

5、数据

数据包报文格式(IP包、TCP报头、UDP报头)的更多相关文章

  1. TCP/IP 数据包报文格式(IP包、TCP报头、UDP报头)(转)

    reference:http://blog.51cto.com/lyhbwwk/2162568                    https://blog.csdn.net/wangzhen209 ...

  2. 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)

    一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:

  3. 计算机网络-数据结构-MAC帧头-IP头-TCP头-UDP头

    第0章 数据是如何进行一步步的封装的 第一章:mac帧头定义 帧头数据结构的定义: 一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME ...

  4. Sendip 命令行发包工具,支持IP、TCP、UDP等

    Sendip是一个linux平台的命令行发数据包工具,目前(2018年2月)支持的协议有ipv4.ipv6.icmp.tcp.udp.bgp.rip.ntp,作者表示其他协议将会后面支持,当他有空写的 ...

  5. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  6. 使用Python计算IP、TCP、UDP校验和

    IP数据报的校验: IP数据报只需要对数据头进行校验,步骤如下: 将接收到的数据的checksum字段设置为0 把需要校验的字段的所有位划分为16位(2字节)的字 把所有16位的字相加,如果遇到进位, ...

  7. TCP/IP、TCP、UDP、Socket知识汇总

    带你了解TCP/IP,UDP,Socket之间关系 https://blog.csdn.net/chaoshenzhaoxichao/article/details/79785318 主要知识点: T ...

  8. TCP中的粘包问题,以及用TCP和UDP实现多次聊天

    TCP协议 在连接内多和客户端说几句 #server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',9001)) sk.listen ...

  9. TCP、UDP数据包大小的限制(UDP数据包一次发送多大为好)——数据帧的物理特性决定的,每层都有一个自己的数据头,层层递减

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

随机推荐

  1. 【音乐欣赏】《PANTA RHEI》 - MYTH & ROID

    曲名:PANTA RHEI 作者:MYTH & ROID [ti:PANTA RHEI (<异世界超能魔术师>TV动画片头曲)] [ar:MYTH & ROID] [al: ...

  2. 忽视自身问题并“积极甩锅”,新氧CEO金星还要脸吗?

    编辑 | 于斌 出品 | 于见(mpyujian) "互联网医美第一股"新氧果然还是爆雷了. 说"果然"是因为于见曾经针对新氧目前的商业模式进行过分析,认为以新 ...

  3. 读写json文件

    def read_json(path): """return dict""" with open(path,'r+')as f: retur ...

  4. oracle 12cR2 RAC deconfig CRS过程记录

    已经停了该节点的crs所有服务: [root@jhjzksrv02 install]# ./rootcrs.sh -force -deconfig -verboseUsing configuratio ...

  5. 吴裕雄 PYTHON 人工智能——智能医疗系统后台智能分诊模块及系统健康养生公告简约版代码展示

    #coding:utf-8 import sys import cx_Oracle import numpy as np import pandas as pd import tensorflow a ...

  6. 吴裕雄 python 人工智能——智能医疗系统后台用户注册、登录和初诊简约版代码展示

    #用户注册.登录模块 #数据库脚本 CREATE TABLE usertable( userid number(8) primary key not null , username varchar(5 ...

  7. netty(一)---服务端源码阅读

    NIO Select 知识 select 示例代码 : //创建 channel 并设置为非阻塞 ServerSocketChannel serverChannel = ServerSocketCha ...

  8. 关于React Native init 项目时候速度太慢的解决方法

    因为init项目的时候需要下载资源,但又因为react native的网站被墙所以下载很慢,解决方法就是换成淘宝的NPM镜像 我是直接使用了命令去替换了NPM $ npm install -g cnp ...

  9. VS中消除ANSI API警告

    最近在VS上写网络程序遇到许多问题,因为VS中将许多ANSI中的API都重写了,那些API大多有漏洞或不能支持现在的一些编程需求了,所以在VS中使用会因为警告而不能用. 但一些老API用着比较方便,了 ...

  10. ASP.NET Core搭建多层网站架构【10-使用JWT进行授权验证】

    2020/01/31, ASP.NET Core 3.1, VS2019, Microsoft.AspNetCore.Authentication.JwtBearer 3.1.1 摘要:基于ASP.N ...