Loading

SOCKET 杂记(来源TCP/IP 协议)

 链路层:大多数链路层技术都有相关协议,描叙由网络硬件传输的相应的PDU格式。描叙 链路层PDU通常使用术语帧,网络层PDU使用分组,传输层PDU使用段。

   帧格式通常支持可变的字节长度 从几字节到数千字节。范围的最大上限称为MTU##最大传输单元。传统 以太网最小帧定义64字节,最大帧是1518字节(4字节CRC 14字节头部)

  大多数的系统使用1500字节的MTU。

 巨行帧在1000MB/S以太网中使用  帧可达到9000字节甚至更大。   大帧与1518的小帧是不兼容的。

两台主机在网络中传输,经过的网络设备中的最小的MTU 为传输的路径MTU。

大多数分组网络(如 以太网)有固定的上限。大多数的流类型网络(串行链路) 提供可设置的上限。它可被帧协议使用。如果IP发送一个数据报,且数据报大于链路层MTU ,则IP通过分组将数据报分解成较小的部分。使每个分片都小于MTU。

 

协议层

     IPV4 头部20字节   IPV6头部字节40字节   IPV4 数据报 最大长度为65535 字节  另外 主机不需要接受大于576字节的IPV4数据报。 UDP的数据报长度一般为512 以避免576字节的IPV4限制   。 (IPV6 主机处理的是链路MTU的数据 最小链路MTU为1280字节)

 用户数据协议

      UDP 是有消息边界的简单的面向数据报的传输层协议。

20字节IPV4头         8字节UDP头 UDP数据

                                                                                                                                                       UDP头             0                                                                       31  

2字节源端口号 2字节目的端口号
 长度 2字节  校验和 2字节
     数据。。。。。。 。。。。。。。

 

  IP分片 与重组。

 

TPC协议

        ACK (acknowledgment): 1. 接受方是否已经收到分组。2接受方收到的分组与发送方发送的分组是否一致。3.接受方给发送方发送数据以确定自己已经收到一个分组。

       分组窗口 和滑动窗口 :  分组窗口:定义一个分组窗口作为已被发送方注入但还没有完成确认的分组的集合。窗口中的分组数量为窗口大小。

      滑动窗口:把所有分组当成一个队列。依照分组窗口大小每次发送分组数据,分组确认发送就把窗口向后移动一个窗口大小的位置。

      流量控制:1.基于速率

                        2.基于窗口大小。窗口大小不确定 ,通过伸缩窗口大小来控制发送数据流量。

IPV4 20字节      IP头

IPV6 40字节

TCP头 20字节(不带选项) TCP数据

                                                                                                                                            0                                                                     15                                                                31

源端口号 16位 目的端口号 16位
 32位序列号  
32位确认号  
  窗口大小 16位
校验和 16位 紧急指针 16位
                选项  

 

 

 关于窗口和SOCKE 配置中的缓冲区

一、TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数

注意:在以Unix为核心的一些操作系统中(不一定都是),SO_RCVBUF选项确实决定了TCP窗口的大小.你设置为多少窗口就为多少.但在Windows上确并非如此,通过一些抓包工具分析后,你会发现这两者并不是一一对应关系,MSDN的说明上确实也告知这一事实.

二、对于server端的socket一定要在listen之间设置缓冲区大小,因为,accept时新产生的socket会继承监听socket的缓冲区大小。对于client端的socket一定要在connet之前设置缓冲区大小,因为connet时需要进行三次握手过程,会通知对方自己的窗口大小。在connet之后再设置缓冲区,已经没有什么意义。

注意:关于设置SO_RCVBUF的时机描述也有问题.服务端在accept前设置了缓冲区后可以向下继承,同样客户端connect前设置缓冲区大小可以在握手时通告窗口(上面说的Windows下的窗口和该设置关系不大,但通过测试还是有一定关系的),但实际上是可以随时设置 的(主要指的是Windows下面,其它系统不一定可以),一但设置后,会随着下一个ACK包,或者普通数据包通告给对方最新的TCP窗口大小,需要注意的是此时窗口只能增大,不能减小,也就是说SO_RCVBUF设置的比上一次小的话,该值是不会作为新窗口大小通告给对方的。

三、由于缓冲区大小在TCP头部只有16位来表示,所以它的最大值是65536,但是对于一些情况来说需要使用更大的滑动窗口,这时候就要使用扩展的滑动窗口,如光纤高速通信网络,或者是卫星长连接网络,需要窗口尽可能的大。这时会使用扩展的32位的滑动窗口大小。

四、滑动窗口听移动规则:

1、窗口合拢:在收到对端数据后,自己确认了数据的正确性,这些数据会被存储到缓冲区,等待应用程序获取。但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK,又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢,缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号,一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次。

2、窗口张开:窗口收缩后,应用进程一旦从缓冲区中取出数据,TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张,实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区。在窗口进行扩张后,需要使用ACK通知对端,这时候ACK的序号依然是上次确认收到包的序号。

3、窗口收缩,窗口的右边缘向左滑动,称为窗口收缩,Host Requirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理。

posted @ 2017-12-05 16:31  奔跑石头  阅读(104)  评论(0)    收藏  举报