简话TCP/IP

    分析IP分片与重组时,想起一个问题,为什么分片和重组发生在IP网络层,而不是数据链路层(以太网/令牌环网),或者运输层(TCP/UDP),或者应用层(FTP/IMAP)呢?

    这是一个简单的问题,却难于回答。这个问题牵扯到另外一个问题——网络分层模型。常见的有,OSI模型和TCP/IP模型(见下图),这是我们所熟知的。但是,ISO组织依据什么理由进行划分呢?

简话TCP/IP_第1张图片

    不同计算机间进行通信,最简单的情况是直接用一根网线连接两台主机,相互之间就能传输电信号了。但计算机需要借助“软件”才能理解这些电信号的具体含义。此处所说的“软件”,可以一般化地理解成“规则”或“协议”的意思,只有这些协议发生作用,两台主机才能真正地开始通信。在这些协议及软件中,以解析电信号的先后顺序排列,可以分成上述几种层次。分层之后,每个层就是一个独立的个体,却又是通信协议族中不可分割的一个成员。所谓不可分割,确实是不可分割,少了哪一层也不行,不像某国的领土尽管不可分割,却可以在他人之手。

 

    每个层都有它的特殊功用。先从物理层/数据链路层协议开始,它们是最底层的协议,直接接触最原始的0-1电信号,不同物理网络之间有特定的物理线路,那些物理线路有专门的技术参数,比如传输数据率,帧结构(见下图),MTU(最大传输单元),传输介质(无线,双绞线,光纤)等等,很显然,不同物理网络之间无法直接通信。物理层协议仅仅负责该物理网络中的机器进行通信,协议内容包括MAC地址格式,表明某个主机的位置;帧结构,数据传输表示方法;传输控制,流量控制、差错控制和链路管理。在这里,最重要的一点,物理层协议仅负责某类物理网络,MAC地址是物理层所特有的。如果有两台计算机A和B,A在令牌环网,B在以太网,按照上面的规定,它们无法通信。事实证明,办法永远比困难多。人们说:要有连接不同网络的方法,就有了网络层协议。简话TCP/IP_第2张图片

 

    网络层位于物理层之上,作用是连接不同物理网络。最著名的网络层协议是IP(internet protocol)。IP协议通过什么方式实现不同网络互联呢?我一直认为,凡是理解一个协议,什么都别做,先看看该协议的数据包格式。IP协议的数据报格式(见下图)。简话TCP/IP_第3张图片

 

    放眼望去,一下看见源IP地址与目的IP地址这两个大胖子,占了IP头部的64位。这也是IP协议最显著的特征。通过创建IP地址这个通用概念,使得数据得以在不同物理网络中传输。但数据链路层传输数据,依赖于MAC地址,因此网络层传输最终需要依靠ARP协议将ip地址映射到物理层的MAC地址。进一步,每个物理层的MTU都不同,大的数据包需要分成小块,小的数据包需要合成大块。这就是IP分片和重组。每一个处理完的数据包都是IP数据包格式。在IP头部中,由标识符,标志,偏移量这32位字段提供IP分片和重组的机制。这32位字段的具体应用过程,以后再讲。好了,具备以上两项功能,IP数据包已经能够在不同网络中畅通无阻了。但是IP数据包头部并不止于此,还提供了其他功能,比如TTL(生存时间,很重要),上层协议类型,校验和,选项等等。其中,上层协议类型有TCP、UDP、IGMP等等。现在,再说网络层是数据链路层的上层,似乎没有那么突兀了。网络层的确提供了更多更广的服务。我也不是完全通晓IP协议族,实际上,IP协议族博大精深,需要更多的实际操作才能更深入的理解它。

 

    接下来到了传输层,这是我最不情愿涉及的一个话题。因为它是又一块难啃的骨头。老规矩,先从简单的入手,来看看UDP数据包的首部格式(见下图):

Format
------

                                    
                  0      7 8     15 16    23 24    31  
                 +--------+--------+--------+--------+ 
                 |     源端口号     |   目的端口号      | 
                 |                 |                 | 
                 +--------+--------+--------+--------+ 
                 |                 |                 | 
                 |     总长度       |    检验和        | 
                 +--------+--------+--------+--------+ 
                 |                                     
                 |          data (数据) ...            
                 +---------------- ...                 

                      User Datagram Header Format(UDP数据包头部格式)

 

     为什么说UDP(传输层)是网络层的上层协议呢?因为端口号。端口号是每个计算机上运行的程序所使用的端口号。说是程序,有些业余,其实是进程。每个计算机上都有许多许多运行着的程序(好吧,是进程),就拿windows来说,开机以后,打开任务管理器,点“进程”一项,能够发现里面有许多.exe格式的东东。每个exe格式的东东都代表了一个正在运行的进程。既然是进程,那么它也可能需要和外部通信。如何通信,计算机为每个进程分配了一个端口号,等于对外宣称的地址,如果你想和这个程序说话,就得用端口号。UDP协议是一个不靠谱的家伙,没有流量控制,非常少的差错控制,而且还是无连接服务。无连接服务,好纠结的术语啊,如果是无连接,那又怎么通信啊,如果能够通信,那又为什么叫它无连接服务啊。真是纠结。初看,我不甚了了。后来才知道,它的无连接指的是它发完数据包,通信过程就算结束了,它就只管发不管对方是否接到这数据包,这很像某党的办事风格。与之对比,TCP就不一样了,非常细致,首先三次握手,确认以后,建立连接,就连“分手”也要三次握手,很像淘宝支付宝付款模式,双方确认后再交易钱财。TCP如何实现这些操作呢?来看TCP头部(下图)。

TCP Header Format

                                    
    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 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          源端口号          |       目的端口号        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        序号                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    确认号                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | 数据   |           |U|A|P|R|S|F|                               |
   | 偏移   | 保留       |R|C|S|S|Y|I|            窗口             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          检验和( Checksum)            |         紧急指针        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    选项                    |    填充   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             数据                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                            TCP头部格式

 

     三次握手,靠的是头部中的控制位(即中间那些英文);识别每个程序,靠的是端口号;确保面向连接服务,靠的是序号和确认号。确保流量控制,靠的是窗口大小这一字段。再啰 嗦一句面向连接,即流式运输,其过程彷佛中间有一条无形的管道连接了两个程序,然后传递数据。TCP很重要,再怎么认真学习也不为过。

 

     终于到了应用层,一层一层地攀爬,真累。应用层,就是我们常见的程序了。每个人都熟悉,例如IE浏览器,QQ,迅雷等等一些程序。在这些程序中,涉及了数据的产生,比如你想聊天,光有TCP/IP协议,没用,你不懂TCP/IP协议,它也不懂你。中间的沟通过程需要通过应用层来完成,聊天软件提供了一个界面给你操作,比如你打字的窗口,传送照片的操作,以及剪切图片的操作,你只要按瓢画葫芦,剩下来的工作就由应用层来完成。它是你和TCP/IP协议之间的桥梁。

 

    简单地,TCP/IP也就是这么回事。其实不然,它还是很复杂的。最后,用一幅巨大的图来结束这篇文章。图中包含了每一层数据包的格式和处理。

    简话TCP/IP_第4张图片

 

 

 

 

注:

    1.图片来自网络,如有侵犯,请通知我,我一并撤销。

    2.上述纯属个人理解,未必正确,欢迎指正。

    3.看到这里,你会发现,图画比文字精彩。

    4.vamei大牛的TCP相关文章非常精彩,一定不要错过。请点:http://www.cnblogs.com/vamei/tag/%E7%BD%91%E7%BB%9C/

 

 

 

 

 

 

 

你可能感兴趣的:(TCP/IP)