TCP与UDP

       数据报中的IP地址标识了数据要到达哪台主机,而传输层首部中的端口号标识了数据要交给哪个应用程序。

       应用程序与另一台主机上的程序通信时,他们之间会有一系列的数据交换,对于任何一端,发送数据时,会把对方的IP地址、端口号和数据交给TCP/IP协议。TCP/IP协议对数据进行封装,每一层都在最前面增加本层的首部,紧接着是上一层传递给它的数据。一些链路层协议还会在最后追加尾部。如:以太网会在帧后添加检测差错的循环冗余检验(CRC)。

       发送数据时,用户的数据首先由应用层协议处理,通常是增加应用层协议的首部,并把数据处理层应用层协议规定的格式。应用层协议通常位于用户空间,处理完数据,调用send函数把数据传递给内核的TCP/IP协议栈。

       TCP层并不是在应用层数据前面简单加上首部,而是根据建立连接时与对方协商出的参数最大段大小(MSS),把数据分成TCP段,每个TCP段的前面是首部,后面是数据。如果应用层数据太大,就会被分成多个TCP段,TCP会把这些段交给IP层去传输。(在传输给IP层之后的数据,都是满足MSS的数据,如果数据过大,会在TCP层进行分段,然后传输到IP层)。

       UDP对数据的封装与TCP不同,它不切分应用层传给它的数据,只是在数据前面增加UDP首部,然后就交给IP层去发送。

       IP协议一次能处理的数据长度是有限的,由IP首部的16位长度字段决定,最大值为65535,这也决定了UDP每次传输的数量量不能超过65535减去IP和UDP首部的值。而TCP对数据切割后,每个TCP段都不超过MTU。所以,对于UDP来说,每次发送的数据量是有限制的,因为UDP不会分段,用户一次发送多大的数据量的数据,会由TCP直接交给IP协议进行发送,而IP协议一次能处理的数据长度有限制。而对于TCP来说,在用户将数据交给运输层的时候,TCP会根据MSS的协商结果进行分段,因此不管用户一次发送的数据为多大,进过传输层分段到达IP层的数据都能满足IP层的数据长度的要求。

TCP分段和IP分片:

       进程间的通信发生在应用层,但是实际的数据传输确是发生在下面的基层。

如下图:


由图可以看出TCP处于传输层,IP处于网络层;IP分片产生的原因是网络层的MTU,TCP分段产生的原因是MSS。IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组。

         客户和服务器进行通话,(1)连接建立之后进行tcp数据通信,我们来看一下传输层的处理:tcp建立三次握手,在建立握手的过程中产生合适的mss(具体的处理机制参见TCP/IP详解P257),这个mss肯定是<=网络层  的最大路径MTU,然后tcp数据封装成ip数据包通过网络层发送,当服务器端传输层接收到tcp数据之后进行tcp重组。ip数据包在 传输过程中是不会发生分片的!我们得到这样一个结论:tcp数据在通信的时候是不会发生ip分片的;(2)连接之后进行udp或icmp通信,由于udp数据采用不可靠的通信,所以他会直接把整个udp数据封装成ip数据包传送,如果MTU小于ip数据包包长,此时就会发生ip分片。关于ip分片可能会发生多次,因为网络中的MTU存在多个,然后到服务器端的ip层进行重组。我们得到这样一个结论:udp数据在通信的时候大部分会发生ip分片。

        TCP传输过程中,IP数据包不会发生分片,是因为此数据在传输层的时候,已经经过分段处理,是由MSS控制的,为了达到一个较好的传输效果;UDP在传输过程中,IP数据包往往会发送IP分片,是因为数据没有进过分段处理,往往大于MTU。MTU是物理介质传输速度的一个限制,是硬件的限制,不是传输流量控制的一部分,MSS是流量传输控制的一部分。

    MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20BytesTCP数据段的包头20Bytes)所以往往MSS1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。因此可以看书,MSS的值一般都是小于MTU的大小,所以一般不会在IP层发生分片。
        IP层接收到数据,先判断数据的长度是否大于底层网络的MTU,如果小于,就直接在数据前面加上IP首部,否则就把数据分成适合底层网络大小的片,并在每一片前面加上IP首部,再把数据传给网络接口。(此操作一般操作的是UDP传下来的数据,TCP协商MSS应该是相对于整个传输路径,即经过不过的传输介质的时候,MSS应该是能满足最低MTU传输介质的线路,即一次传输过程中不会发生分片操作)。

多播和广播通信:
         TCP只支持两台设备之间的单播通信,无法做到把TCP的数据同时传递给多台主机,多台主机间的多播或广播通信必须用UDP实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值