TCP/UDP/IP分片

来源:互联网 发布:如何成为数据分析师 编辑:程序博客网 时间:2024/05/20 07:35

一、协议报文格式

1.MAC报文格式

由于一个MAC帧报文最小是64个字节,所以除了MAC帧头和帧尾18个字节,数据部分至少需要46个字节

2.IP报文:


(1)服务类型(Type of Service ,TOS)字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策。


(2)总长度字段:占16比特。指明整个数据报的长度(以字节为单位)。最大长度为65535字节。

(3)标识字段:占16比特。用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1

(4)标志位字段:占3比特。标志一份数据报是否要求分段

(5)段偏移字段:占13比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。

(6)生存期(TTL:Time to Live)字段:占8比特。用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为32、64、128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃。

(7)协议字段:占8比特。指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。

IP数据报固定首部为20字节,因此TCP报文长度最大为1500-20=1480字节

3.TCP协议

标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:      

◆URG:紧急指针(urgent pointer)有效。      

◆ACK:确认序号有效。      

◆PSH:接收方应该尽快将这个报文段交给应用层。      

◆RST:重建连接。      

◆SYN:发起一个连接。      

◆FIN:释放一个连接。      

窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。

TCP的包头至少也是20个字节,故TCP的数据部分至多有1500-20-20=1460个字节,此为MSS的值

4.UDP协议

UDP的报头只有8个字节,故数据部分至多有1500-20-8=1472个字节

5.网络数据交换模式:

网络层提供两种服务:分别是虚电路服务和数据报服务

(1)虚电路

传统电信网提供的主要业务是提供电话服务。电信网使用昂贵的程控交换机,用面向连接的通信方式,使电信网络能够向用户(实际上就是电话机)提供可靠传输的服务。

通信步骤:

a.应当先建立连接(但在分组交换中是建立一条虚电路VC(Virtual Circuit)),以保证通信双方所需的一切网络资源。 
b.然后双方就沿着已建立的虚电路发送分组。 
c.这样的分组的首部就不需要填写完整的目的主机地址,而只需填写这条虚电路的编号(一个不大的整数),因而减少了分组的开销。 
d.如果这种通信方式再使用可靠传输的网络协议,就可使所发送的分组无差错按序地到达终点,当然也不丢失、不重复。 
f.在通信结束后,要释放建立的虚电路。

(2)数据报服务

因特网在设计上就采用了和电信网完全不同的思路。 由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。 因特网的设计思路: 

 a.网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接。每个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。 

 b.网络层不提供服务质量的承诺。也就是说所传送的分组,可能出错、丢失、重复或失序,当然也不保证分组交付的时限。



6.TCP、UDP分段和IP分片

如果IP层有一个数据要传,且数据的长度比链路层的MTU还大,那么IP层就要进行分片(fragmentation),把数据报分成若干片,这样每一个分片都小于MTU。 
  把一份IP数据报进行分片以后,由到达目的端的IP层来进行重新组装,其目的是使分片和重新组装过程对运输层(TCP/UDP)是透明的。由于每一分片都是一个独立的包,当这些数据报的片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。
尽管IP分片过程看起来透明的,但有一点让人不想使用它:即使只丢失一片数据也要重新传整个数据报。why?因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。
使用UDP很容易导致IP分片,TCP试图避免IP分片。那么TCP是如何试图避免IP分片的呢?其实说白了,采用TCP协议进行数据传输是不会造成IP分片的,因为一旦TCP数据过大,超过了MSS,则在传输层会对TCP包进行分段,自然到了IP层的数据报肯定不会超过MTU,当然也就不用分片了。而对于UDP数据报,如果UDP组成的IP数据报长度超过了1500,那么IP数据报显然就要进行分片,因为UDP不能像TCP一样自己进行分段。总结:UDP不会分段,就由我IP来分。TCP会分段,当然也就不用我IP来分了!




原创粉丝点击