在 UDP 中,UDP 是直接把应用层的数据往对方的端口上 “扔” ,他基本没有任何的处理。所以说他发给网络层的数据如果大于1500字节,也就是大于MTU。这个时候发送方 IP 层就需要分片。把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是 ,由于UDP的特性,当某一片数据传送中丢失时 , 接收方便无法重组数据报,将导致丢弃整个UDP数据报。
而在 TCP 中会按MTU合理分片,也就是在 TCP 中有一个概念叫做最大报文段长度(MSS)它规定了 TCP 的报文段的最大长度,注意这个不包括 TCP 的头,也就是他的典型值就是 1460 个字节(TCP 和 IP 的头各占用了 20 字节)。并且由于 TCP 是有序号和确认号的,接收方会缓存未按序到达的数据,根据序号重新排序报文段后再交给应用层。
4. 流量控制流量控制一般指的就是在接收方接受报文段的时候,应用层的上层程序可能在忙于做一些其他的事情,没有时间处理缓存中的数据,如果发送方在发送的时候不控制它的速度很有可能导致接受缓存溢出,导致数据丢失。
相对的还有一种情况是由于两台主机之间的网络比较拥塞,如果发送方还是以一个比较快的速度发送的话就可能导致大量的丢包,这个时候也需要发送方降低发送的速度。
虽然看起来上面的两种情况都是由于可能导致数据丢失而让发送主机降低发送速度,但是一定要把这两种情况分开,因为前者是属于流量控制 而后者是 拥塞控制 ,那将是我们后面需要讨论的事情。不要把这两个概念混了。
其实说到流量控制我们就不得不提一下滑动窗口协议,这个是流量控制的基础。由于 TCP 连接是一个全双工的也就是在发送的时候也是可以接受的,所以在发送端和接收端同时维持了发送窗口和接收窗口。这里为了方便讨论我们就按照单方向来讨论。
接收方维持一个接受窗口,发送方一个发送窗口。发送的时候要知道接受窗口还有多少空间,也就是发送的数据量不能超过接受窗口的大小,否则就溢出了。而当我们收到一个接收方的 ACK 的时候我们就可以移动接受窗口把那些已经确认的数据滑动到窗口之外,发送窗口同理把确认的移出去。这样一直维持两个窗口大小,当接收方不能在接受数据的时候就把自己的窗口大小调整为 0 发送窗口就不会发送数据了。但是有一个问题,这个时候当接收窗口再调大的时候他不会主动通知发送方,这里采用的是发送方主动询问。
还是画个图看的比较直观:
拥塞控制一般都是由于网络中的主机发送的数据太多导致的拥塞,一般拥塞的都是一些负载比较高的路由,这时候为了获得更好的数据传输稳定性,我们必须采用拥塞控制,当然也为了减轻路由的负载防止崩溃。
这里主要介绍两个拥塞控制的方法,一个是慢开始,另外一个称为快恢复。
1.慢开始一开始我们不知道网络中的拥塞情况,我们就发一个数据包
如果没有发生拥塞我们成倍的增加发送的数据的数量。
当然我们也不能到无休止的增加,这里有一个慢开始门限,到达门限则加法增加,每次加一。
这时候如果遇到了拥塞,我们直接跳到第一步,也就是从头开始,并且把慢开始门限调整为拥塞时候的数据量的一半再次开始。
2.快恢复一开始我们不知道网络中的拥塞情况,我们就发一个数据包
如果没有发生拥塞我们成倍的增加发送的数据的数量。
当然我们也不能到无休止的增加,这里有一个慢开始门限,到达门限则加法增加,每次加一。
这时候如果遇到了拥塞,这里就是唯一和慢开始不一样的地方,直接从新的慢开始门限加法增长。
3.连接管理 1. 建立连接3次握手客户端像服务端发起连接,首先向服务端发送一个特殊的报文,这个报文的 SYN 位被置 1 ,然后生成一个随机的序号填入到 TCP 的头部。这个报文段称为 SYN 报文,用于请求连接。