2,数据帧 “帧”数据由两部分组成:帧头和帧数据。帧头包括接收方主机物理地址的定位以及其它网络信息。帧数据区含有一个数据体。为确保计算机能够解释数据帧中的数据,这两台计算机使用一种公用的通讯协议。互联网使用的通讯协议简称IP,即互联网协议。IP数据体由两部分组成:数据体头部和数据体的数据区。数据体头部包括IP源地址和IP目标地址,以及其它信息。数据体的数据区包括用户数据协议(UDP),传输控制协议(TCP),还有数据包的其他信息。这些数据包都含有附加的进程信息以及实际数据。
3,数据包的封装
上三层: 数据
传输层: 数据 TCP/IP(HEAD) 段
网络层: 数据 TCP/IP(HEAD) IP(HEAD) 包
数据链路层: 数据 TCP/IP(HEAD) IP(HEAD) 帧
物理层: 111111111111000000000000000011 比特
4,TCP段格式
要想对TCP有着较为详细的了解的话,那TCP的包格式是一定要了解,有了结构的清楚认识才能真正的理解它的工作过程和各种机制的原理,以下就是TCP的结构图:
TCP数据包可分为TCP包头和来自应用层的数据两部分
中间的标志位就是用于协议的一些机制的实现的比特位大家可以看到有6比特,它们依次如下:
URG、ACK、PSH、RST、SYN、FIN。
URG表示紧急指针字段有效;
ACK置位表示确认号字段有效;
PSH表示当前报文需要请求推(push)操作;
RST置位表示复位TCP连接;
SYN用于建立TCP连接时同步序号;
FIN用于释放TCP连接时标识发送方比特流结束
源端口和目的端口:各为16比特,用于表示应用层的连接。源端口表示产生数据包的应用层进程,而目的端口则表示数据包所要到达的目的进程。
序列号:为32比特,表示数据流中的字节数。序列号为首字节在整个数据流中的位置。初始序列号随机产生,并在连接建立阶段予以同步。
确认号:表示序号为确认号减去1的数据包及其以前的所有数据包已经正确接收,也就是说他相当于下一个准备接收的字节的序号。
头部信息:4比特,用于指示数据起始位置。由于TCP包头中可选项的长度可变,因此整个包头的长度不固定。如果没有附加字段,则TCP数据包基本长度为20字节。
窗口:16位,表示源端主机在请求接收端等待确认之前需要接收的字节数。它用于流量控制,窗口大小根据网络拥塞情况和资源可用性进行增减。
校验位:16位。用于检查TCP数据包头和数据的一致性。
紧急指针:16位。当URG码有效时只向紧急数据字节。
可选项:存在时表示TCP包头后还有另外的4字节数据。TCP常用的选项为最大数据包(并非整个TCP报文)MSS。每一个TCP段都包含一个固定的20字节的段头。TCP段头由20字节固定头和一些可选项组成。实际数据部分最多可以有65495(65535-20-20=65495)字节。
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
因特网协议允许IP分片,这样就可以将数据报分成足够小的片段以通过那些最大传输单元小于该数据报原始大小的链路了。这一分片过程发生在 IP 层(OSI模型的第三层,即网络层),它使用的是将分组发送到链路上的网络接口的最大传输单元的值。原始分组的分片都被加上了标记,这样目的主机的 IP 层就能将分组重组成原始的数据报了
什么是MTU?
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
比如下图显示的常见的MTU(图截自《TCP/IP详解 卷一:协议》)
如上图所示,我们平常接触的网络对数据帧的长度都有一个限制,只是其最大值不同。链路层的这个特性就称之为MTU,最大传输单元。
数据帧超过MTU怎么办?
如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成托干片,让每一片都不超过MTU。注意,IP分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
把一个IP数据包分片以后,只有到达目的地之后才进行重新组装。重新组装由目的端的IP层完成,它的目的就是使分片和重新组装过程对于传输层(TCP和UDP)是透明的。已经分片过的数据包仍然有可能会再次进行分片,也就是说IP分片可能发生不止一次。什么保证了这点?因为IP头部中包含的数据为分片和重新组装提供了足够的信息。
来做个测试吧,看看怎么分片的,我用ping命令,也就是利用ICMP协议来测试。以太网MTU为1500,减去IP头部20个字节,再减去ICMP 8个字节,那么我们认为不分片的上限值为1500-20-8=1472。
注意看下图的实验结果,很明显。
5,UDP段格式
6,IP包格式
IPv4首部一般是20字节长。在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016。 IPv4提供不同,大部分是很少用的选项,使得IPv4包首部最长可扩展到60字节(总是4个字节4个字节的扩展)
0 |
4 |
8 |
12 |
16 |
19 |
24 |
31 |
版本 |
首部长度 |
服务类型 |
长度 |
认证 |
标志 |
段偏移量 |
TTL |
协议 |
校验和 |
源IP地址 |
目的IP地址 |
选项 ... |
IP包头字段说明
版本:4位,指定IP协议的版本号。
包头长度(IHL):4位,IP协议包头的长度,指明IPv4协议包头长度的字节数包含多少个32位。由于IPv4的包头可能包含可变数量的可选项,所以这个字段可以用来确定IPv4数据报中数据部分的偏移位置。IPv4包头的最小长度是20个字节,因此IHL这个字段的最小值用十进制表示就是5 (5x4 = 20字节)。就是说,它表示的是包头的总字节数是4字节的倍数。
服务类型:定义IP协议包的处理方法,它包含如下子字段
过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制) 延迟字段:1位,取值:0(正常)、1(期特低的延迟) 流量字段:1位,取值:0(正常)、1(期特高的流量) 可靠性字段:1位,取值:0(正常)、1(期特高的可靠性) 成本字段:1位,取值:0(正常)、1(期特最小成本) 未使用:1位
长度:IP包的总长
认证:
标志:是一个3位的控制字段,包含:
保留位:1位 不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段) 更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)
段偏移量:当数据分组时,它和更多段位(MF, More fragments)进行连接,帮助目的主机将分段的包组合。
TTL:表示数据包在网络上生存多久,每通过一个路由器该值减一,为0时将被路由器丢弃。TTL<64 128
协议:8位,这个字段定义了IP数据报的数据部分使用的协议类型。常用的协议及其十进制数值包括ICMP(1)、TCP(6)、UDP(17)。
校验和:16位,是IPv4数据报包头的校验和。
源IP地址:
目的IP地址:
7,帧结构:
DA | SA , TYPE ,LOAD , FCS
目标/源MAC , 帧类型 ,帧封装数据 , 帧校验序列
各6Bytes , 2Bytes ,46-1500Bytes , 4Bytes
在TCP/IP的头域部分,就能知道发送的是一个数据报文,还是一个确认报文