经典的tcp/ip协议开发工程师面试必读--转自:linux网络协议开发工程师 capsicum_ipv6

原创 2005年06月02日 13:26:00
网际协议(Internet Protocol,IP)
      在互联网结构中,用一些路由器互联了多个物理网络。这个结构可能会产生误导,因为关键之处是互联网络提供给用户的接口,而不是网络互联的技术。

      用户可把互联网想象成一个虚拟网络,它把所有主机都互联起来,并可以通过这个虚拟网络进行通信;互联网的底层结构被隐藏起来并且无关紧要。

在rfc791中,是按如下图所示定义了协议层次中的个种协议的位置:
                 +------+ +-----+ +-----+     +-----+  
                 |Telnet| | FTP | | TFTP| ... | ... |  
                 +------+ +-----+ +-----+     +-----+  
                       |   |         |           |    
                      +-----+     +-----+     +-----+  
                      | TCP |     | UDP | ... | ... |  
                      +-----+     +-----+     +-----+  
                         |           |           |    
                      +--------------------------+----+
                      |    Internet Protocol & ICMP   |
                      +--------------------------+----+
                                     |                
                        +---------------------------+  
                        |   Local Network Protocol  |  
                        +---------------------------+  

                         Protocol Relationships
      所以,互联网就是对物理网络的一个抽象。因为,在最底层它提供了相同的功能:接受分组并进行交付。更高层的互联网软件只是丰富了一些用户可以看到的功能。

      这种概念性的划分的最重要的优势是,可以在不干扰其他服务的情况下,替换某个服务,因此,这三层上的研究和开发可以并行开展。

无连接交付系统
最基本的互联网服务由一个分组交付系统组成。该服务具有:
Unreliable(不可靠的)
Connectionless(无连接的)
best-effort delivery(尽最大努力交付的)

网际协议的目的
这种具有不可靠、无连接交付机制的协议称为网际协议(IP)。
IP有三个重要的定义:
1.IP定义了在整个TCP/IP互联网上数据传输所用的基本单元,因此,它规定了互联网上传输的数据的具体格式;
2.IP软件完成选路的功能,选择一个数据发送的路径;
3.除了数据格式和选路的精确而正式定义外,IP还包括了一组体现了不可靠分组交付思路的规则。
这些规则指明了主机和路由器之间
i.应该如何处理分组;
ii.何时及如何发出错误信息;
iii.在什么情况下可以放弃分组。

IP是TCP/IP互联网设计中最基本的部分,因此有时称TCP/IP互联网为基于IP的技术。

IP数据报

      在一个物理网络上,传输的单元是一个包含首部和数据的帧,首部给出了(物理)源地址和目的地址之类的信息。

IP数据报
      互联网则把他的基本传输单元称为Internet数据报(datagram),有时称为数据报。
      数据报被划分为首部和数据区,而且,数据报首部也包含了源地址和目的地址以及一个标识数据报内容的类型字段。
区别:
数据报首部包含的是IP地址,而帧的首部包含的是物理地址。
数据报格式
数据报处理是在软件中进行的,所以它的格式和内容都不受任何硬件的限制。

A summary of the contents of the internet header follows:
                                    
    0                   1                   2                   3  
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version| IHL   |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

VERS(版本)
      数据报的前4比特,包含了创建该数据报的IP协议的版本信息。当前IP协议的版本是4,因此,术语IPV4常用于表示当前协议。

IHL(首部字段)
      4比特,给出了以32比特字长为单位的首部长度。除了IP选项(OPTIONS)以及相应的填充(PADDING)字段以外,首部的所有字段的长度都是固定的。最常见的首部不含选项和填充,长度为20个八位组。

TOTAL  LENGTH(总长度)
有16比特,所以IP数据报的最大长度为216 ,即最大长度为65535八位组。

SERVICE TYPE (服务类型)
8比特的服务类型,在非正式的场合称为TOS(TYPE OF SERVICE),它规定了数据报的处理方式。
0            1            2            3        4        5        6        7
PRECEDENCE    D    T    R    未用

PRECEDENCE优先级,3比特,表示数据报的重要性,0――7
Bits 0-2:  Precedence.
111 - Network Control
          110 - Internetwork Control
          101 - CRITIC/ECP
          100 - Flash Override
          011 - Flash
          010 - Immediate
          001 - Priority
          000 - Routine

D、T、R分别代表本数据报所希望传输的类型:
    D(Delay),低延时需求;
    T(Throughput),高吞吐量需求;
    R(Reliability),高可靠性需求。

      Bit    3:  0 = Normal Delay,      1 = Low Delay.
      Bits   4:  0 = Normal Throughput, 1 = High Throughput.
      Bits   5:  0 = Normal Relibility, 1 = High Relibility.
      Bit  6-7:  Reserved for Future Use.

例如:
Precedence:    5
      Delay:         0
      Throughput:    1
      Reliability:     1

在这个例子中,对于ARPANET是有效的参数,优先级高于半数,并且从高吞吐量和高可靠性被声明的标准信息中选择。
    
互联网不能保证所需求的传输,所以,传输需求是作为路由算法的提示,而不是要求。


区分服务DS(differentiated service)
20世纪90年代后期,IETF重新定义了服务类型字段的含义。
0            1            2            3        4        5        6        7
码点    未用

码点(CODEPOINT),DSCP,码点值映射一个底层服务定义,一般是通过指针数组实现的。

为了维护与初始定义的向后兼容性,该标准把码点的前3比特和后3比特区别对待。

XXX000
当后3个比特包含0时候,优先级比特定义服务的8个主要服务类。

区别服务设计也适应了另一种实际情况:广泛地将优先级6和7用于路由通信量。

无论使用TOS还是DS,都应该认识到,路由软件必须从现有底层物理网络技术中选择一种,并且必须把它与本地策略相联系,这是十分重要的。

因为互联网并不保证提供某种特定服务,沿路径的路由器并不保证同意这种请求,所以,我们把服务类型规范作为路由算法的一个提示,帮助它根据本地策略和对路径上可用的硬件技术的知识,选择不同的路由路径。
数据报的封装(encapsulation)
数据报可以有多长,与帧不同,帧必须由硬件识别的,数据报是由软件处理的,协议的设计者可以任意选择其长度。

实践中,我们知道,数据报要通过底层的物理网络进行传输。为了使互联网传输更为有效,我们更愿意保证每个数据报在独立的物理帧中传输,如有可能,我们要把网络分组的抽象直接映射到一个实际的分组。

在一个网络帧中携带一个数据报的传输方式称为封装(encapsulation).

硬件并不识别数据报的格式,也不理解IP目的地址,因此,当一台机器把一个IP数据报发送到另一台机器时,整个数据报时通过网络帧的数据部分传输。即,物理网络把包括首部在内的整个数据报都看作数据。
最大传输单元(maximum transfer unit, MTU)
IP的设计者应该选择一个最大的数据报长度,使它总能够完整的放到一个帧里。
MTU可能很小,根据不同的硬件:
每种分组交换技术都对一个物理帧可传输的数据量规定了一个固定的上界。

我们不是设计数据报的大小是他与物理网络的限制相近,因为我们设计的主旨是隐藏底层网络技术和方便用户通信。所以:
TCP/IP软件选择了一个方便的初始数据报大小;
同时提供一种机制,在MTU较小的网络上,把长数据报划分成更小的部分。
数据报划分得到的这种小块称为数据报片(fragment),这个划分过程称为分片(fragmentation)。

分片(fragmentation)通常发生在路由器上。
因为IP以8倍数的八位组表示数据的偏移量,所以片的大小必须是8的倍数。
在目的站处理之前必须对收到的数据报片进行重组(reassemble)。
每个数据报片都包含一个数据报首部,它基本上复制了原始数据报的首部,并且保持数据报片的总长度小于传输它的底层网络的MTU长度。

数据报片的重组(REASSEMBLE)
TCP/IP网络要求,数据报片在到达主机后才对他们进行重组。
它允许每片独立的路由,而不需要中间路由器存储或重组。

分片(FRAGMENTATION)控制
数据报的首部的标识(IDENTIFICATION)、标志(FLAGS)、片偏移量(FRAGMENT OFFSET)三个字段用来控制数据报的分片(fragmentation)和重组(reassemble)。

标识(IDENTIFICATION)

目的主机通过数据报片的标识字段及源站地址用来识别数据报。

IP软件使用一种方法在主存中保持一个全局计数器,每产生一个新数据报,计数器加1,并将该值分配给数据报的标识字段。

标志(FLAGS)

标志字段的低端比特指明本片中的数据是否为原始数据的最后一片。称为片未完比特。
三个比特。    
      Bit 0: reserved, must be zero
      Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.
      Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.

         0  1  2
        +---+---+---+
        |   | D | M |
        | 0  | F | F |
        +---+---+---+

片偏移量(FRAGMENT OFFSET)
数据报片的片偏移量字段指明分片所携带数据在原始数据报种的偏移量,以8个八位组为单位,第一片的偏移量必须为0.

TTL(Time to Live)生存时间
设置该数据报在互联网系统中允许存在的时间,单位为:秒。

只要一个寿命字段为“0”,路由器就丢弃该数据报。

实例
Example 1

This is an example of the minimal data carrying internet datagram:
                                    
    0                   1                   2                   3  
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Ver= 4 |IHL= 5 |Type of Service|        Total Length = 21      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Identification = 111     |Flg=0|   Fragment Offset = 0   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Time = 123  |  Protocol = 1 |        header checksum        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         source address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      destination address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     data      |                                                
   +-+-+-+-+-+-+-+-+                                                

                       Example Internet Datagram

这个IP数据报的协议版本是IP4,首部包括20个字节,数据报总长21个字节,数据报的数据区是一个字节。数据报可以是一个完整的数据报,不需要分片。

Example 2

在这个例子中,数据报大小为452字节,MTU为280字节,我们要分成两片。
                                    
    0                   1                   2                   3  
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Ver= 4 |IHL= 5 |Type of Service|       Total Length = 472      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Identification = 111      |Flg=0|     Fragment Offset = 0 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Time = 123  | Protocol = 6  |        header checksum        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         source address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      destination address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   /                                                               /
   /                                                               /
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |             data              |                                
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                                
                      
Example Internet Datagram

Notation:
        FO    -  Fragment Offset
        IHL   -  Internet Header Length
        DF    -  Don't Fragment flag
        MF    -  More Fragments flag
        TL    -  Total Length
        OFO   -  Old Fragment Offset
        OIHL  -  Old Internet Header Length
        OMF   -  Old More Fragments flag
        OTL   -  Old Total Length
        NFB   -  Number of Fragment Blocks
        MTU   -  Maximum Transmission Unit



Procedure:
因为MTU为280,IHL以4个八位组为单位,偏移量以8个八位组为单位
IF TL =< MTU
THEN Submit this datagram to the next step in datagram processing
ELSE IF DF = 1
THEN discard the datagram
ELSE To produce the first fragment:

//复制原始数据报头
        (1)  Copy the original internet header;
        (2)  OIHL <- IHL; OTL <- TL; OFO <- FO; OMF <- MF;
//IHL以4个八位组为单位,偏移量以8个八位组为单位
(3)    NFB <- (MTU-IHL*4)/8;
//(280-5*4)/8=32.5,NFB=32
所以数据区为32×8=256字节,TL=256+20=276
        (4)  Attach the first NFB*8 data octets;
        (5)  Correct the header:
             MF <- 1; TL <- (IHL*4) + (NFB*8);
             Recompute Checksum;
        (6)  Submit this fragment to the next step in datagram processing;        
    0                   1                   2                   3  
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Ver= 4 |IHL= 5 |Type of Service|       Total Length = 276      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Identification = 111      |Flg=1|     Fragment Offset = 0 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Time = 119  | Protocol = 6  |        Header Checksum        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         source address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      destination address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   /                                                               /
   /                                                               /
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                       Example Internet Fragment

To produce the second fragment:

        (7)  Selectively copy the internet header (some options are not copied, see option definitions);
        (8)  Append the remaining data;
        (9)  Correct the header:
             //(5×4-0)/4=5,所以IHL=5
IHL <- (((OIHL*4)-(length of options not copied))+3)/4;
             //452-32×8-0=196
TL <- OTL - NFB*8 - (OIHL-IHL)*4);
//0+32
             FO <- OFO + NFB;
MF <- OMF;
Recompute Checksum;
        (10) Submit this fragment to the fragmentation test; DONE.
                                  
  And the second fragment.
                                    
    0                   1                   2                   3  
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Ver= 4 |IHL= 5 |Type of Service|       Total Length = 216      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Identification = 111      |Flg=0|  Fragment Offset  =  32 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Time = 119  | Protocol = 6  |        Header Checksum        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         source address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      destination address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   /                                                               /
   /                                                               /
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            data               |                                
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                                

                       Example Internet Fragment

最值得学习的JAVA技术

最值得学习的JAVA技术 http://club.topsage.com/thread-2574005-1-1.html 【来源:网络;整理:soolly】 Carlos Per...

java技术达人成长记<3>WEB架构师成长之路(6年)

WEB架构师成长之路之一-走正确的路      本人也是coding很多年,虽然很失败,但也总算有点失败的心得,不过我在中国,大多数程序员都是像我一样,在一直走着弯路,如果想成为一个架构师,...

TCP-IP协议系列\IPV6详解

  • 2009年10月31日 22:46
  • 3.82MB
  • 下载

TCP-IP协议详解(4)地址耗尽危机(IPv4与IPv6地址)

IP地址是IP协议的重要组成部分,它可以识别接入互联网中的任意一台设备。在IP接力中,我们已经看到,IP包的头部写有出发地和目的地的IP地址。IP包上携带的IP地址和路由器相配合,最终允许IP包从互联...
  • Mark_LQ
  • Mark_LQ
  • 2015年03月14日 22:03
  • 430

TCP/IP协议 之IPV4与IPV6的区别

IPV4 IPv4,是互联网协议(Internet Protocol,IP)的第四版,也是第一个被广泛使用,构成现今互联网技术的基石的协议。1981年Jon Postel 在RFC791...

2015春季实习生招聘 多益网络科技有限公司笔试+面试 游戏开发工程师

多益网络游戏开发工程师 笔试题+面试内容呈现与分析

阿里巴巴2014校园招聘【测试开发工程师】笔试题(北京站)/Linux面试

现有一完全的P2P共享协议,每次两个节点通讯后都能获取对方已经获取的全部信息,现在使得系统中每个节点都知道所有节点的文件信息,共17个节点,假设只能通过多次两个对等节点之间通讯的方式,则最少需要()次...

网络协议-ipv6技术培训

  • 2008年06月26日 22:48
  • 4.87MB
  • 下载

网络协议之ipv6

ipv6地址
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经典的tcp/ip协议开发工程师面试必读--转自:linux网络协议开发工程师 capsicum_ipv6
举报原因:
原因补充:

(最多只允许输入30个字)