网络传输层不同数据大小的处理

                 网络传输层不同数据大小的处理

             Horin|贺勤
        Email: horin153@msn.com
        Blog: http://blog.youkuaiyun.com/horin153/


    做网络传输时,为了使传输高效,一般都会对传输层的数据大小进行限制。数据过大时,会发生分片操作,但过小时会不会也有什么类似的操作?如果有,大小范围又是多少呢?
    这个问题,很多程序员,甚至一些做了多年网络编程的程序员,可能都有疑惑。下面谈谈作者个人的理解,如果有误,敬请指正。


1,传输层的发送缓冲区

    对普通的以太网,每一个 TCP 套接口有一个发送缓冲区,可以用 SO_SNDBUF 选项来改变该缓冲区的大小。当应用进程调用 write 时,内核从应用进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据 (或是应用进程的缓冲区大于套接口的发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被挂起 (睡眠)。这里假设套接口是阻塞的。内核将不从 write 系统调用返回,直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。
    即 TCP 套接口的 write 调用成功返回,仅表示可以重新使用应用进程的缓冲区,并不表示对方已经收到数据。

    UDP 套接口有发送缓冲区大小,但它仅仅是写到套接口的 UDP 数据报的大小上限。因为 UDP 是不可靠的,它不必保存应用进程的数据拷贝,因此无需一个真正的发送缓冲区。应用进程的数据在沿协议栈向下传递时,以某种形式拷贝到内核的缓冲区,然而当链路层把数据传出后这个拷贝就丢弃。
    从写 UDP 套接口的 write 调用成功返回,表示数据报或所有片段已被加入链路层的输出队列。


2,几个概念

    MTU,maximum transmission unit,最大传输单元,它由硬件规定。以太网链路的 MTU 为 1500 字节;这也是当今最常见的路径 MTU。IPv4 要求的最小 MTU 是 68 字节,IPv6 要求的最小 MTU 为 576 字节。
    为了使传输有效,最好每个 IP 数据报在独立的物理帧中传输。当通过一个大的 MTU 时,把数据报大小限制到最小的 MTU 是不经济的;同样,如果数据报的大小比最大 MTU 还要大,则数据报需要分片,降低了传输效率。

    MSS,maximum segment size,最大分节大小,即能接受的每个 TCP 分节中的最大数据量。
TCP 以 MSS(<= MTU - 40 (IP V4)) 大小或更小的块发送数据给 IP;其中 MSS 是由对方告知的,当对方未通告时就用 536 这个值;因为 IPv4 的最小重组缓冲区大小为 576 字节。


3,以太网各层的结构

    为简化描述,以 octet 代替八位组。

    对以太网 MAC 帧,首部 18 octet,帧的 Data 段大小为 [46, 1500] octet。
    以太网上传输的帧是可变长度的,但帧的长度不能小于 64 八位组、或大于 1518 八位组 (首部、数据和 CRC)。
    帧的结构为:
前同步码:8 octet
目的地址、源地址:各 6 octet
帧类型:2 octet
帧数据:46 - 1500 octet
CRC:4 octet

    常见的 IP 数据报的首部不含选项 (IP options) 和填充 (padding),长度是 20 octet,另外还可以带上 <= 40 octet 的选项。
    数据报处理是在软件中进行的,故其格式和内容都不受任何硬件的限制。

    TCP 数据包的首部是 20 octet。
    UDP 数据报的首部为 8 octet。


4,TCP 层不同数据大小的处理

    根据上面 MTU 的讨论,对普通的 IPv4 以太网,当 TCP 数据包的数据大小 n 为:
              68-40 <= n <= 1500-40
时,该数据包只需要逐层添加相应的首部信息,然后由物理层发送出去。过大时则分片发送,过小时则填充后发送。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值