网络7层模型理解 分段、分片、MTU、MSS

应用层:telnet,ftp,http,snmp 第七层:
表示层: 第六层:
会话层: 第五层:
传输层:tcp,udp 第四层:
网络层:ip 第三层:
数据链路层:sdlc,hdlc,ppp,stp,帧中继 第二层:
物理层: 第一层:

举个例子:
ftp://opdb1:[email protected]:21/home/dsfftp/dsf/20091110/0000010000000039023007/2009111003251_wap_l.jpg

1、应用层使用ftp协议,传递各种参数,包括用户名,密码,ip地址,端口,文件路径等封装成ftp对象
ftpinfo 往下传递

2、表示层:对ftpinfo对象进行加密,ftp没有加密特性,直接往下传递,如果是登陆操作,会在此处进行密码加密操作。数据的压缩和解压缩, 加密和解密等工作都由表示层负责。

3、会话层:建立到192.168.1.1的通信连接

4、传输层:使用tcp协议,本机随机端口,准备连接192.168.1.1地址21端口,并对ftpinfo进行分包处理。此外,传输层还要处理端到端的差错控制和流量控制问题,分包整包。在这一层,数据的单位称为数据段(segment)。

5、网络层:对192.168.1.1这个地址进行路由选择,进行分发数据包到192.168.1.1。此外,网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)。

6、数据链路层: 将数据包分解成帧,保证物理传输可靠。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。这一层中将bit流封装成frame帧。

7、物理层:不解释了,传递帧数据,返回成功或者失败.

补充:
1、
OSI的观点是必须把数据链路层做成是可靠传输的。因此在CRC检测基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。
这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。
因特网广泛使用的数据链路层协议都不适用确认和重传机制,即不要求数据链路层向上层提供可靠传输的服务(因为这要付出的代价太高,不合算)。如果在数据链路层传输数据时除了差错并且需要进行改正,那么改正差错的任务就由上层协议(如,运输层TCP协议)来完成。实验证明,这样可以提高通信效率。
2、
据链路层对上层IP包的长度是有限制的, 以典型的以太网为例, 这个限制值即为MTU(最大值是1500字节), 为此, IP层对上层网络层的数据也有限制, 这个限制值是MSS(最大值为1460字节)
我们设想一下, 如果应用层需要用UDP发送2000字节的数据, 那么加上IP头和UDP头后, 就是2028个字节了, 超过了MTU的限制, 那怎么办呢? 此时, 协议栈在IP层采用了分片的机制, 把大的应用数据拆分成若干个小的数据, 也样就有了若干个IP包, 而且会保证每个IP包不超过1500字节。用图来表示就是:
网络7层模型理解 分段、分片、MTU、MSS_第1张图片
可以看到, 分成了两个IP包来发送, 且第二个IP包没有UDP数据, 没有端口信息! 这一点十分值得注意。 如果过滤端口来抓包, 肯定抓不到这个IP包。 第一个包也会有点怪异, 其中UDP头中标明的包长度包含而第二个包的应用数据长度。

我们再看看TCP, 上面说了, MSS的最大值是1460(不同系统的MSS值可能不一样, 这个值是在三次握手过程的syn包中确定的, 当然, 实际中的业务数据仍然可以小于syn包中约定的 MSS值)

回头看一下, 上面UDP例子中的IP分片实在IP层完成的, 而TCP分段是在TCP层完成的, 如图
网络7层模型理解 分段、分片、MTU、MSS_第2张图片
可以看到, TCP层提前完成了分段, 而且, 两个TCP包中都有TCP头, 这是必然的。 所以到了IP层后, 都保留了TCP头, 当然就有了端口信息啊。 这一点与IP层次的分片是不同的。
而且我们应该看到, 因为TCP包在TCP层已经做了限制, 这就决定了, 等TCP包达到IP层的时候, IP层的数据绝对不会超过MTU, 因此, 对于TCP传输来说, IP层是没有必要分片的, 因为TCP层分段的时候, 已经考虑到了这个限制。
所以, 我们经常会说, UDP传输中, IP分片, 是受到了MTU的限制, TCP传输中, TCP分段, 是受到了MSS的限制(实际上最终还是受到了MTU的限制)

你可能感兴趣的:(网络编程)