网络编程day001-----网络中对单个数据报数据量的限制-IPv4头部DF标志位,TCP头部MSS选项,链路层的MTU

网络传输数据时,对一个数据报的大小限制。
TCP中表现出的限制条件-MSS
在TCP协议的SYN消息中,有一个MSS的可选参数,这个参数的值有16位。
当客户端向服务端发起一个TCP的连接时,进行三次握手的连接,客户端发送的SYN消息中可以选择是否带上MSS这个选项。这个选项会告知服务端,客户端单个TCP节的最大尺寸,也是客户端重组缓存区的大小。服务端会根据客户端中MSS的值来确定单个TCP节的数据量,尽可能的避免分片
链路层表现出的限制条件-MTU
在了解什么时分片之前,需要先直到MTU的概念。
MTU是链路层传输中单个数据报允许的最大字节数。MTU由硬件决定,在以太网中,一般MTU = 1500。这1500个字节包含IP头部和TCP头部再加上数据。那么当一个数据报的大小超过了网络中规定的MTU,就会产生分片。具体如下:
服务器产生了一个大于MTU的数据报,然后由服务器对其进行分片;
在IPv4的路由器中,如果在转发数据报的过程中,得到一个数据量大于其外出链路的MTU的数据报,则由IPv4路由器来进行分片;
在IPv6的路由器中,如果在转发数据报的过程中,得到一个数据量大于其外出链路的MTU的数据报,则会返回一个ICMP的错误,提示”packet too big”;
但是,如果IPv6的路由器自己产生的数据报大于MTU,那么IPv6路由器将会对其分片。
如果IPv4协议设置其头部的DF标志位,则服务器不会对这个IP数据报进行分片,IPv4的路由器也不会对这个数据报进行分片,如果遇到数据量大于MTU的数据报,则会返回一个ICMPv4的错误”目标地址不可达,需要分片但是DF被设置”。
IPv6也有DF的标志位,但是被隐含设置了,所以对转发的数据量超出外出链路MTU的数据报都是报错的。
一个数据报数据量的上限
单个数据报数据量 = IP头部 + TCP头部 + 数据
在IPv4中,IP头部20Byte,TCP头部20Byte,数据的大小,理论上可以达到65535,因为MSS的值是16位的。
但是IPv4的一个数据报,最大也就是65535,所以数据部分,只能达到65495。所以理论上一个数据报最大能达到65535。
这个时候外出链路的MTU就决定了数据报的上限。
在IPv6中,表示一个数据报大小,是使用一个32位的值。比IPv4更大,所以在极限的情况下,其大小也是被外出链路的MTU限制。
一个数据报数据量的下限
在IPv4中,规定,一个重组缓存区最小也要576Byte;IPv6则是规定1500Byte。
所以在IPv4下,一个数据报最小也要达到576Byte,去除IP和TCP的头部,数据部分就需要536Byte。
数据从应用程序写入到TCP套接口
TCP
当应用程序调用write系统函数时,内核将用户缓存区中的数据拷贝到发送缓存区(可用SO_SNDBUF这个套接口选项来改变缓存区的大小)。如果当前发送缓存区已满,或者用户缓存区大于发送缓存区,导致内核没有完成拷贝工作,用户进程就会进入睡眠状态,直到内核将用户缓存区内的数据完全拷贝。TCP会将发送缓存区中的数据发送出去,只有等到对端返回了确认消息,TCP才会删除发送缓存区中的内容。
随后数据(数据量<=MSS)加上TCP头部到网络层,再加上IP头部(在这里根据外出链路的MTU,可能会会对数据报进行分片,数据量<=MTU)到链路层。每个链路都有一个输出队列,如果输入队列已满,多余的分组到达后,会被丢弃,同时返回一个错误,沿着协议栈向上传递直到TCP,TCP收到之后,会重传这些被丢弃的数据。

猜你喜欢

转载自blog.csdn.net/displaymessage/article/details/80672468