socket和TCP/IP协议族的关系
socket提供如下两点功能:
- 将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据,或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据。
- 应用程序可以通过他们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信行为。比如可以通过setsockopt函数来设置IP数据报在网络上的存活时间。
IP
不可靠是指IP协议不能保证IP数据报准确地到达接收端,他只是承诺尽最大努力。很多情况下都能导致IP数据报发送失败。比如TTL,接收端发现收到的IP数据报不正确。无论哪种情况,发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,而且不会试图重传。因此,使用IP服务的上层协议(比如TCP协议)需要自己实现数据确认,超时重传等机制达到可靠传输的目的。
IPv4头部结构
长度通常为20字节,除非含有可变长的选项部分(最多40字节)
4位版本号(version):是指IP协议的版本。对IPv4来说是4。
4位头部长度(header length):标识该IP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。
8位服务类型(Type of Service, TOS):包含一个3位的优先权字段(已被忽略),4位的TOS字段和1位保留字段(必须置0)。4位TOS字段跟别标识:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置位1,应用程序应该根据实际需要来设置他。比如ssh和telnet这样的登录程序需要的是最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。
16位总长度(total length):是指整个IP数据报的长度,以字节为单位。因此IP数据包的最大长度为2^16-1(65535)字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。记下来的3个字段则描述了如何实现分片。
16位标识(identification):唯一地标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其值就加1,。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。
3位标志:第一位保留。第二位标识禁止分片,如果设置了这个位,IP模块将不对数据进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃该数据并返回一个ICMP差错报文。第三位标识更多分片,除了数据报的最后一个分片外,其他分片都要将他置1。
13位分片偏移(fragmentation offset):是分片相对原始IP数据报开始出(仅值数据部分)的偏移。实际的偏移值应该是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。
8位生存时间(time to live, TTL):是数据到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中没经过一个路由,该值就被路由器减一。当TTL值为0时,路由器将丢弃该数据报,并向源端发送一个TCMP差错报文。TTL值可以防止数据报陷入路由循环。
8位协议(protocol):用来区分上层协议。其中ICMP是1,TCP是6,UDP是17.
16位头部校验和(header checksum):由发送端填充,接收端对其使用CRC算法以检验IP数据报头部(注意,仅检验头部)在传输过程中是否损坏。
32位的源IP地址和目的端IP地址用来标识数据报的发送端和接收端,一般情况下,这两个地址在整个数据报的传输过程中保持变,不论他中间经过了多少个中转路由器。
可变长的可选信息(option):这部分最多包含40字节,因为IP头部最长是60字节(固定字节20)。可用的IP选项包括:
1. **记录路由**:告诉数据包途径的所有路由器都将自己的IP地址填入IP头部的选项部分,这样我们可以**跟踪数据报的传输路径。**
2. **时间戳**(timestamp):告诉每个路由器都将数据包被转发的时间填入IP头部的选项部分,这样就可以测量**途径路由之间数据报的传输时间。**
3. **松散源路由选择**:指定一个路由器IP地址列表,报文发送过程中必须经过其中所有的路由器。
4. **严格源路由选择**:和松散路由类似,不过数据报只能经过被指定的路由器。
IP分片
分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。
IP头部的数据报标识,标志和片偏移给IP的分片和重组提供了足够的信息,一个IP数据报的每个分片都具有自己的IP头部,他们具有相同的标识值,但具有不同的片偏移。并且除了最后一个分片外,其他分片都将设置为MF标志。此外,每个分片的IP头部的总长度字段都将设置为该分片的长度。
以太网帧的MTU是1500字节,因此他携带的IP数据报的数据部分最多是1480字节。
概念
- 无连接:是指IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须指定对方的IP地址。这样的好处是:简单、高效。我们无需为保持通信的状态而分配一些内核资源,也无需每次传输时都携带状态信息。