一、IP封包格式说明
前言
IP 协议用 IP 报文头封装传输层报文,IP 报文头包含了如下的信息:这个
报文从哪个传输层协议过来,它准备被发送到哪台机器,它从哪儿来以及一些
其他有用的信息.
IP 协议是一个非面向连接的协议,也就是说 IP 不需要协商一个连接。面
向连接的协议需要协商一个连接,然后在这个连接上面收发数据,最后关闭这
个连接。TCP 就是这样的协议,但是它建立在 IP 基础之上的。IP 不是面向连接
的原因有很多种,其中一个原因就是它不会为很多应用增加不必要的开销。对
于报文丢失的情况,通过简单的重传就可以解决问题,而不需新建连接,等待
对端确认等等额外开销。
1、IP报文格式
上面图中每一行所占用的位数为32bits,各个表头的内容分别介绍如下
版本(Version)
第 0 到 3bit。版本字段是二进制表示的,IPV4 为 0100,而
IPV6 为 0110.这个字段在报文过滤中很少用到。
网络报文头长(Internet Header Length)
第 4-7bit,它表示以 4 字节为单位的报文头长,例如没有选项的报文长度为 20byte,这样这个字段就为 5
TOS 字段
第 8 到 15bit,这个字段是 IP 报文头里面最复杂的部分之一,这个字段已经被更新 3 次了。他们的基本含义没有发生变化,但是他们 的具体实现却改变了。最初,这个字段被称为服务类别(type of
service)
0-2bit 称为优先权字段;
第 3bit 表示时延;
第 4bit 表示吞吐量;
第5bit表示对可靠性的要求级别;
最后两个 bit 预留 .
例如:
以太网络的种种相关规格可以让这个ip封包加速且降低延迟,某些特殊的标志就是在这里说明的。
注:
这种实现方式在很多老的硬件里面还能够看到。但是在后 来更新的 ECN 版本里面,第 6-7bit 被使用了,这样他们就被设置了值而不是原 先的预留值 0.但是很多老的防火墙和路由器在检查报文时候,发现这些字段是 1 就会把这个报文丢掉。
封包总长(TL)
通常以byte做单位来表示该封包的总长度﹐此数值包括标头和数据的总和,最大可达65535bytes
识别码(ID)
每一个IP封包都有一个16bit的唯一识别码。 当程序产生的数据要通过网路传送时﹐都会在传送层被拆散成封包形式发送﹐当封包要进行重组的时候﹐就是依据这个ID 。
Flags(特殊标识)
这是当封包在传输过程中进行最佳组合时使用的3个bit来标识
X__:R:当此值为0的时候﹐表示目前未被使用
_X_:DF:若为0表示可以分段,若为1表示不可分段
__X:MF:若为0表示此IP为最后分段,若为1表示非最后分段
FragmentOffset(分段偏移)--13bits
当一个大封包在经过一些传输单位(MTU)较小的路径时,会被被切割成碎片(fragment)再进行传送(这个切割和传送层的打包有所不同,它是由网路层决定的)。 由于网路情况或其它因素影响﹐其抵达顺序并不会和当初切割顺序一致的。 所以当封包进行切割的时候﹐会为各片段做好定位记录,如果封包没有被切割﹐那么FO的值为“0”
Time To Live(TTL,存活时间)--8bits
当一个封包被赋予TTL值,TTL是以hop为单位,每经过一个router就减一﹐如果封包TTL值被降为0的时候﹐就会被丢弃。 这样﹐当封包在传递过程中由于某些原因而未能抵达目的地的时候﹐就可以避免其一直充斥在网络上面,之所以不返回响应,是因为响应也是点用网络资源的,所以直接就丢弃了
Protocol Number(协议代码)-8bits
来自传输层与网络层本身的其他数据都放置在ip封包当中的,我们可以在IP表头记载这个IP封包内的数据是什么,在这个字段就是记载每种数据封包的内容啦,在这个字段记载的代码与相关的封包协议名称如下所示:
当然啦,我们比较常见到的还是TCP、UDP、ICMP
Header Checksum(表头检查码)--16bits这个数值主要用来检错用的﹐用以确保封包被正确无误的接收到。 如果一切无误﹐就会发出确认信息﹐表示接收正常。
Source Address(SA)
来源的IP地址,从这里我们知道IP是32位。
Destination Address(DA)
有来源还需要目标才能传送,这里就是目标的IP地址
Options(其它参数)
这个是额外的功能,提供包括安全处理机制、路由纪录、时间戳,严格与宽松之来源路由等 。
Padding(补齐项目)& Padding
Options栏位长度不定, 可用来扩充功能。
Padding栏位是为了让表头(包含Options 栏位) 刚好是4 Bytes 的倍数。
二、TCP封包格式
1、TCP作用
TCP 协议位于 IP 协议层之上,TCP 是一个有状态的协议,并且通过内部机
制能够确认报文是否被对方正确的接收。TCP 主要有如下几个作用:
最主要就是确认双方的的可靠数据收发
数据在网络层和应用层之间正确传输
数据报文能够正确的被应用层接收
报文在传输过程中不会乱序
2、TCP报文格式
3、参数说明
属性说明Source Port(16bit)
表示这个报文的发送端口,这个源端口最初和发送进程进行了直接绑定,但是现在我们的实现,通过 IP 地址,源端口和目的端口进行 hash,然后映射到相应的应用程序。
Destination Port(16bit)
这个是 TCP 报文的远端目的端口。这个和源端口一样,原来是和应用直接绑定的,现在也是通过 hash 映射到应用程序,这样容许系统能够打开更多的连接。
Sequence Number(32bit)
序列号主要被赋予每一个报文,这样可以对报文进行排序。最后这个序列号在回应报文的 ACK 字段予以确认。
Acknowledge Number(32bit)
当我们确认一个报文被接收的时候,我们就发送 ACK 确认这个报文。例如,我们接收到一个带有序列号的报文,而且这个报文是一个正常报文,那么我们就回应一个 ACK 报文,在 ACK 字段里面填写的正是过来的序列号。
数据偏移(Data Offset)这个字段表明 TCP 的报文头有多长,或者说数据从哪儿开始。它也是以 4 字节为单位的,这样即使不是 4 字节对齐,也可以通过尾部的填充字段来添加。
预留(Reserved)(6)这些 bits 暂时预留,在 RFC793 里面,这也宝航接下来哦
CWR 和 ECN 字段,根据 RFC793,从 100 到 105 这两个 bit 必须全部被置零。后来我们引入了 ECN,这样带来了很多麻烦,因为老式的防火墙或者路由器会把这些字段置位的报文丢弃。
控制标记
紧急指针(URG)当URG被设定为1的时候就表示这是一个携有紧急资料的封包。确认(ACK)这个位置表明这个报文是对我们收到报文的一个回应,我们确认一个报文表明我们不仅仅收到报文,而且这个报文没有错误。发送方收到 ACK之后就知道哪个报文已经被确认了,从而从发送缓冲释放该报文。
上送(PSH)“推”标志位表示立刻把数据上送给用户程序,不管用户窗口情
况或者是否还有后续报文。
重置标志告诉对端关闭这个链接。这个标志主要有着几个作用。例如这个连接因为某些原因已经不能工作了,或者说这个连接不存在甚至可能是报文走错了路径。
同步序列号(SYN)如果SYN为1时表示要求双方进行同步沟通完成(FIN)如果封包的FIN为1的时候就表示传送结束然後双方发出结束回应进而正式终止一个TCP传送过程滑动窗口(windows size 16bit)窗口大小常常被接收者用来告诉发送者还有多少空闲缓冲可以
使用。这个是通过发送 ACK 确认报文来完成的,这个报文里面包含了 ACK 值以
及可以容纳的缓冲大小。每一次 ACK 报文都会更新这个窗口大小。
这个指针指向紧急数据的尾部,如果这个连接内有紧急数据需要处理,那么发送方会设置 URG 标志以及把紧急指针指向紧急数据的尾部。
选项字段(Options)这个可选字段简单的来说,总是包含三方面内容。一个是初始域,通过它我们可以知道可选项的长度。第二是可选项的类别,让我们知道是那个可选项。最后就是实际的可选项数据。可选项的完全列表可以通过文末的TCP options链接找到。填充(Padding)填充字段确保整个 TCP 报文头是 4 字节对齐的。填充字段总
是用全 0 来填充。
三、UDP报文
1、前言
UDP 可以看作一个叫简化的 TCP 报文头,它主要包括源/目的端口,报文头
长以及校验和。
2、报文格式
3、参数说明
属性说明源地址(Source port)源端口表明这个报文是从哪儿发送出来的,但是假如你不需要对端的回复的话,这个字段也可以设置为全 0,但是在大部分实现里面,这个字段都是填充合理值。目的端口(Destination port)这个表明报文的目的端口,这是必选项,和源端口不同。报文长度(Length) 这个长度是整个报文的长度,包括报文头和数据区。校验和(Checksum)和 TCP 的校验和一样。五、总结
TCP协议和UDP协议的区别
1,TCP协议面向连接,UDP协议面向非连接
2,TCP协议传输速度慢,UDP协议传输速度快
3,TCP协议保证数据顺序,UDP协议不保证
4,TCP协议保证数据正确性,UDP协议可能丢包
5,TCP协议对系统资源要求多,UDP协议要求少