TCP/IP协议理论

参考文献:
《TCP-IP详解卷一:协议》
《用TCP-IP进行网际互联第一卷:原理、协议与结构》
《LwIP协议深度剖析与实战演练》
《嵌入式Internet TCP IP基础、实现及应用》

TCP/IP协议族通俗综述

这里写图片描述
这里写图片描述
这里写图片描述
OSI结构仅仅停留在理论阶段,没有以实践作为依据,实现起来过去复杂,所以TCP/IP协议栈简化了。

从底层到顶层剖析TCP/IP协议栈

1、链路层

  • 链路层说白了就是我们平时接触的网卡和网卡的驱动程序。存在的意义在于上层(比如网络层,传输层等等)不知道也不需要知道数据在物理上是如何传输的。就是它让上层可以不需要考虑数据物理传输的细节,更加专注于自己该做的事。就是TCP或者UDP程序可以在不修改的情况下移植到使用另外一种链路层的设备上面去。
  • 链路层协议的功能就是将ip数据包封装成什么样的形式通过什么发送出去?网络接口层有不同的实现方式,比如可以通过有线或者无线方式,方式不同那么意味者不同的帧结构,发送速率。虽然这些形式不同,但是最终传送的肯定是上层协议帧,只有链路层可以剥离出上层协议帧就可以了,至于链路层通过什么方式发送出去,那就不重要了。

  • 在TCP/IP协议族中,链路层主要有三个目的: (1)为IP模块发送和接收IP数据报;(2)为ARP模块发送 ARP请求和接收ARP应答;(3)为RARP发送RARP请求和接收RARP应答。
    这里写图片描述

1、ARP-Address Resolution Protocol-地址解析协议

主机A仅仅知道主机B的IP地址,但是不知道物理地址。设计人员想到了一种策略。
主机A广播一个特殊分组,请求主机B相应。包括B在内的所有主机接收到此请求,但是只有B识别他的IP地址,然后发出一个包含其物理地址的应答。A收到应答后就可物理地址和IP地址进行发送分组了。
每一个需要RAP都提供一个ARP高速缓冲。
设备通过自己知道的IP地址来获得自己不知道的物理地址的协议。
- 当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。地址解析为IP地址和数据链路层目的地址提供映射:32bit的IP地址和数据链路层使用的任何类型的地址。
这里写图片描述
- 在ARP背后有一个基本概念,那就是网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是, TCP/IP有自己的地址:32 bit的IP地址。知道主机的 IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。 ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。
这里写图片描述

  • MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置,产品出产后Mac地址就固定了。又全球制造商统一分配。
  • 以太网目的地址:目的MAC地址
  • 以太网源地址:源的MAC地址
  • 硬件类型:表示硬件地址类型,1表示以太网地址
  • 协议类型:表示要映射的协议地址类型。0x0800表示映射IP地址。
  • 硬件地址和协议地址长度:分别是6,4字节
  • op:操作字段它们是ARP请求(值为1)、ARP应答(值为 2)、RARP请求(值为3)和RARP应答(值为4)。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。
  • 发送端硬件地址(以太网目的地址MAC地址),发送端的协议地址(发送端IP地址),目的硬件地址(以太网目的地址MAC地址),目的的协议地址(目的IP地址)
  • 对于ARP请求,除了目的的MAC地址外的其余都是填充值;当目的端收到ARP请求报文后,补全信息即可。

2、RARP-Reverse Address Resolution Protocol-逆向地址解析协议

RARP发出要反向解析的物理地址并希望返回其对应的IP地址。RARP基本淘汰,大多使用DHCP协议。
局域网在很久以前是无盘工作站的,无盘工作站是硬盘和操作系统分开的,这样由于主机上没有硬盘故不能保存IP地址信息,而MAC地址是永久存储在网卡中的,所以此时主机知道自己的MAC但不知道IP,但是要通信必须有IP地址啊,否则FTP/TFTP/SMTP等应用层协议都不能使用了,如果局域网管理员一台一台的给主机配置IP就太麻烦了,此时你可能会想到用DHCP啊,DHCP就是用于自动获取IP地址的,正确又不完全正确,正确是DHCP确实能解决这个问题,不正确是因为在很久以前DHCP是没有的(DHCP RFC文档 2131在1997年3月份才发布),那么这个问题该如何解决呢?答案就是今天探讨的RARP(RFC文档编号903,发布日期1984年6月份),通常情况下我们把RARP理解为把MAC地址映射为IP地址,如果你还套用ARP的解析流程和应用场景去分析RARP那就越想越不通了,这里说的把MAC地址映射为IP地址实际上无盘主机在开机后,网卡引导程序就不淡定了,它会通过广播的方式询问局域网所有主机,有谁知道我的IP地址啊?RARP服务器收到这个报文后就会告诉它你的IP地址是多少,这样无盘主机就有IP地址了,就可以使用FTP快乐的下载文件了,直到BOOTP的出现,什么?怎么不是DHCP,确实在1985年9月份BOOTP出现并取代了RARP协议,编号是RFC 951,然后就一直到1997年DHCP的出现。

至此我已经列出了三种可以分配IP地址的协议了,分别是RARP、BOOTP、DHCP,那这三种协议有什么区别呢?

  • 1、RARP的实现是在数据链路层实现的,BOOTP和DHCP的实现是在UDP传输层实现的,这仅仅是表面上的区别,那优势呢,如果没有优势BOOTP就不会取代RARP了,我的理解是RARP工作在数据链路层就需要网卡去解析协议,而随着操作系统的发展,纯软件实现的网络协议内核比纯硬件网卡解析更加实惠,而BOOTP就是使用网络协议内核去解析的。
  • 2、RARP服务器只能提供简单的地址分配,而且这些IP地址和MAC地址必须要提前在RARP服务器上配置好,而BOOTP和DHCP有更多复杂的功能,比如租约周期、地址池、网关和DNS服务器等,在这个年代你没有DNS只有IP也是不能上网的,除非你手动指定DNS服务器。另外BOOTP在获取到IP地址后客户端还会通过TFTP或者FTP协议去网络服务器上下载一个引导镜像文件。
  • 3、DHCP是BOOTP的升级版本,增加了Option配置选项,而且DHCP可以分配之前已经分过的但当前没有使用的IP地址,提高了IP地址利用率。而BOOTP的IP地址和MAC地址的映射是事先配置好不能动态改变的。
    允许计算机从服务器获得IP地址的协议。对于寻找自己的IP地址的机器和提供这一地址的服务器,他们之间的所有通信都只能使用物理网络实施。RAPR机制提供目标的物理硬件地址,唯一的标识处理器并广播RARP请求。网络上的服务器接收报文,在一个表中查找映射,并应答对方。一旦机器获得它的IP地址,就把地址存储在主存里,直到重启以前不再使用RARP。另外RARP还有两种替换方案BOOTP和DHCP。

2、网络层

1、IP(Internet Protocol)网际协议

常见的广域网路由器就工作在IP层。 1、互联网功能可以抽象为一个分组交付系统,将分组从一个地方交付到另外一个地方,实现主机之间的互联。IP是一种不可靠的无连接数据报协议,尽最大努力完成交付服务,但是不保证每一个分组可以正确到达。需要配合上层协议(如TCP)以保证可靠性。 2、网络层接收上层传输层数据分组,封装层IP数据报文,填入首部,使用路由算法来确定直接交付数据报,还是传递给路由器。也负责处理传入数据报,并检查有效性,然后判断该数据报是否给本机,否则路由算法将数据转发出去。如果是给主机,那么除去首部得到数据分组并传递给上层传输层解析。

IP地址的由来:假如PC机在同一个子网,数据报可以通过ARP发送出去。但是这样有一个缺陷,那就是当ARP以广播的方式发送数据包时候,需要确保所有设备都可以接受到该数据包,这样不仅仅传输效率低,而且局限在发送者所在子网。如果两台计算机不在同一个子网,广播传不出去,这种设计合理,否则互联网所有机器都会收到包,导致网络收到危害。
假如两个子网,需要找出一种方法区分哪些MAC地址属于同一个子网络,哪些不是的。如果同一个子网就选择广播方式,否则就采用路由方式发送。这个区分就是依靠的IP地址。它的作用就是引进一套新的地址,使得用户可以区分不同计算机是否属于同一个子网。这两个地址并没有任何联系都是唯一存在的。

![这里写图片描述](https://img-blog.csdn.net/20170904164940278?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDcxMDQ1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  • 4位版本
    4-IPV4,6-IPV6
  • 4位首部长度
    最大数值15,单位是4字节。如1111就表示15*4=60字节所以首部最长60字节,普通IP该字段是5,如上图所示。
  • 8位服务类型(TOS)
    分别代表最小时延、最大吞吐量,最高可靠性和最小费用,路由器通过这些标识进行流量的优先排序。不同应用,TOS不同。
    这里写图片描述
  • 16位总长度(字节数)
    整个IP数据包的长度,利用首部长度字段和总长度就知道IP数据报内容的起始位置和长度。理论上IP数据包总长度可以达到65535,但是实际底层链路不允许这个大数据包。以太网链路中规定MTU为1500,如比这个大,那么分组发送;最少也应是46字节,如比这个小,那么填充0以满足长度要求。
  • 16位标识
    标识字段唯一地标识主机发送的每一份数据报,在分片时候复制到每一片中。
  • 3位标志
    用一个比特来表示更多的片,除了最后一片外。
  • 13位片偏移
    该片偏移原始数据包开始处的位置,另外当数据报分片时候,没片总长度改为该片的长度值。
  • 8位生存时间(TTL)
    time-to-live
    设置数据包可以经过的最多路由器数。通常位32或者64,一旦通过路由器处理,值减1,。该值为0时,数据报丢弃,并发送ICMP报文通知源主机。主要为了防止数据包不会在网络中无休止飘荡,可以看成是网络自动防范故障的一种机制。
  • 8位协议
    识别数据包序列中上层协议数据报类型,指明IP数据报的数据区域中数据的格式。
    由于TCP、 UDP、 ICMP和IGMP都要向IP传送数据,因此IP必须在生成的IP首部中加入某种标识,以表明数据属于哪一层。为此,IP在首部中存入一个长度为8bit的数值,称作协议域。 1表示为ICMP协议, 2表示为IGMP协议, 6表示为TCP协议,17表示为UDP协议。根据这个字段识别哪个协议向IP传送数据。
  • 16位首部校验和
    仅仅针对IP首部,并不关心内部数据在传输过程是否出错,对于数据的校验由上层协议房负责,如ICMP、IGMP、TCP、UDP协议都会计算头部以及整个数据区的校验和。使用首部校验有一个优点,那就是在数据包转发过程中,每经过一个路由器,首部字段仅修改TTL,而数据包中的数据部没有改变,因此校验和仅仅针对首部,可以提高路由器处理分组的效率。
    首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串 16bit的字组成),结果存在检验和字段中。当收到一份 I P数据报后,同样对首部中每个 16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
  • 发送源IP地址,接受源IP地址
  • 选项
  • 这些选项很少被使用,并非所有的主机和路由器都支持这些选项。选项字段一直都是以32bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍(这是首部长度字段所要求的)。
  • 数据
    使用IP传递的实际数据。
    这就是从上一层TCP、 UDP、 ICMP和IGMP向IP层传送数据包。

2、IP地址及子网掩码

1、IP地址:
- IP地址对网络及网络上某台主机进行编码,所以指定的不是一台计算机,而是网络上的一条连接。连接n个网络的路由器有n个不同IP地址,每一个地址对应一个网络连接。
- IP地址32位4字节表示,点分十进制表示每一字节,为了容易记住。
- 不是仅仅把IP地址当作单纯的一个网络号以及主机号。由于A类和B类的主机号位数较多所以将主机号再分成一个子网号和一个主机号。
- 给定了IP和子网之后,IP路由可以先匹配网络号,然后子网号,然后主机号进行路由选择。
这里写图片描述
这里写图片描述
这里写图片描述
几个特殊的IP地址:
环回地址:用到了127.x.x.x这样的网络地址,主要用于本机网络软件测试和进程通信。
网络地址:IP为134.89.32.33为B类,则134.89.0.0为网络地址,当数据包到达一个网络,路由器依据释放与本地网络匹配,选择转发数据包或者发送到指定主机。A,B,C三类地址每一个网络号占用一个主机号。
直接广播地址:对应主机号全为1,代表数据包发送给本网络内所有设备。
这里写图片描述
受限广播地址:IP全为1的地址。255.255.255.255。向本地网络中所有主机发送广播消息,当采用标准IP编时候和直接广播地址一样,采用子网编址,有限广播被限制在本子网中,此地址仅仅可以作为目的地址。
本网络上特定主机:用户相与本网络内部特定主机通信,可以将网络号全部设置为0,如0.0.11.32表示数据包发送给本地网络11.32主机处。
本网络本主机:0.0.0.0表示本网络上的本主机,通常用于主机启动暂时不知道自己IP地址,为了获得有效IP地址,用全0来表示自己。

2、子网划分
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
- 下面是一种子网分配方法,子网有254个,每一个子网有254台主机,这样可以将网络分成更多类别。
这里写图片描述
- 为了区分一个IP中子网号和主机号,确定了一种叫做子网掩码的东西,其中网络号和子网号对应的位置给bit1,主机号的位给bit0,根据子网掩码就可知道子网号与主机号之间的分界线,如下图:
这里写图片描述

网络地址转换:当内部网络用户连接互联网时候,NAT将用户的内部IP地址转换成一个外部公共的IP地址,当数据从外部返回时,NAT将目的地址替换成用户的内部IP地址。可以有效解决IP地址短缺的问题,实现方式如端口多路复用。

3、IP分片/重组

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

4、ICMP(Internet Control Message Protocol)Internet控制报文协议

1、IP 协议完成了数据报在各个主机之间的递交,但是它并不完美,它仅仅提供一种无连接的不可靠数据报交付,协议本身不提供任何错误检验与恢复机制。为了弥补 IP协议的这个缺陷, ICMP协议应运而生。 ICMP协议用于在IP主机、路由器之间传递控制消息,这里的控制消息可以包括很多种,例如数据报错误信息、网络状况信息、主机状况信息等,这些控制消息虽然并不传输用户数据,但是对于用户数据报的有效递交起着重要作用。
2、IP协议提供的是一种不可靠的无连接数据报交付服务,在一个IP数据报被交付到最终目的主机的过程中,网络中的每个路由器都是自主运行的,它们只根据数据报中的目的IP地址为数据报选择最佳的路径。任何数据报可能经过多次路由转发,最终才到达其终点。当然,这只是理想状况,但现实却可能出现问题,虽然目前网络通信链路和设备的性能有了极大的改善,但还是没有任何系统在任意时刻都能保证正常运行。在数据报递交的过程中,会经常出现目的主机临时或永久性地断开网络连接、通信线路故障、中间路由器发生拥塞而无法处理数据报等情况,这些都将导致个IP数据报无法被正常交付。
3、IP协议本身不提供差错报告和差错控制机制来保证数据报递交的有效性,在路由器无法递交一个数据报,或者数据报生存时间为 0 时,路由器都会直接丢弃掉这个数据报。尽管路由器IP层认为这样的处理是合理的(可以提高数据报处理效率),但是在很多情况下,源主机还是期望在数据报道递交出现异常的情况下得到相关的失败信息,以便进行重传或者其他处理。
4、IP协议缺少一个辅助机制,即主机的管理和查询机制。在某些情况下,源主机需要确定另一个主机或者路由器是否是活跃的,对于不活跃的主机,就没有必要再向它发送数据报了,因为这是徒劳的。在另外一些情况下,一个主机的管理员期望能获得另一个主机或者路由器上的信息,以根据这些信息进行主机自身的配置、数据报发送控制等。

为了解决上述问题,TCP/IP 协议引进ICMP协议,从TCP/IP的分层结构上来看,它同IP协议一样,处于网络层,但ICMP协议有自己的一套报文格式,且它需要使用 IP协议来递交报文,即ICMP报文是放在IP数据报中的数据区域发送的,从这点看来, ICMP协议又有点像一个传输层协议,其实不然,因为ICMP报文的目的不是
目的主机上的某个应用程序,它不为应用程序提供传输服务,ICMP报文的目的是目的主机上的网络层处理软件。
这里写图片描述
这里写图片描述
ICMP使用IP进行交互,是因为一个报文可能要经过几个物理网络才能到达其最终目的地,因此它不可能单独通过某个物理传输进行交付,必须使用IP提供的交付服务,屏蔽掉各种底层物理结构的差异。由于IP数据报本身被放在物理数据帧中进行发送,因此,ICMP报文本身也可能丢失或者出现传输错误。

  • 8位类型字段
    不同类型由报文中的类型字段和代码字段来共同决定。类型字段属于大类,代码段决定大类别下面的小类别。
    这里写图片描述
    这里写图片描述
    这里写图片描述
  • 16位检验和
  • 不同类型有不同内容,根据实际应用填充相应的字节。

5、ICMP应用之ping程序

仅仅发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。一般来说,如果不能Ping到某台主机,那么就不能Telnet或者FTP到那台主机。Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。

这里写图片描述

发送方选合适的长度填充相应的数据区域,接收方根据这个会送请求产生一个回送应答,回送应答中的数据与请求中的数据应该完全相同。

以下取自百度百科,解释得还可以通俗易懂:
我们以下面一个网络为例:有A、B、C、D四台机子,一台路由RA,子网掩码均为255.255.255.0,默认网关为192.168.0.1
1.在同一网段内
在主机A上运行“Ping 192.168.0.5”后,都发生了些什么呢? 首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.0.5”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.0.5”作为目的地
址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并想办法得到192.168.0.5的MAC地址(物理地址,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),以便交给数据链路层构建一个数据帧。关键就在这里,IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的MAC,如果以前两机有过通信,在A机的ARP缓存表应该有B机IP与其MAC的映射关系,如果没有,就发一个ARP请求广播,得到B机的MAC,一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。
2.不在同一网段内
在主机A上运行“Ping 192.168.1.4”后,开始跟上面一样,到了怎样得到MAC地址时,IP协议通过计算发现D机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的MAC取过来,至于怎样得到路由的MAC,跟上面一样,先在ARP缓存表找,找不到就广播。路由得到这个数据帧后,再跟主机D进行联系,如果找不到,就向主机A返回一个超时的信息。

  • 标识符:
    类Unix系统将标识符设置为发送PID,使一台主机可以运行多个ping程序。
  • 序号:
    序号从0开始,每发送一次新的回显请求就加1.

3 运输层

1、主要提供应用程序直接的通信服务,也叫端端通信。IP协议提供了在各台主机之间传送数据报的功能,数据报的目的地是某一台主机,而不是主机上的某个应用程序。但是各个主机并不是数据报中数据的最终目的地,数据的最终目的地应该是主机上的某个特定应用程序。那么IP层怎么样将数据报递交给各个应用程序呢?这就是传输层协议的功能。

2、运输层协议需要完成几个重要任务:
第一,为两个通信的进程提供连接机制,即传输层将怎样去识别两个正在通信的进程,当主机的传输层从 IP 层得到一个数据报时,它将使用何种方式把数据递交给最终的应用程序?在传输层中,这是通过端口号来完成的;
第二,传输层应该提供数据传送服务,在数据发送端,传输层将用户数据进行组装、编号,将数据分割成可运输的单元,然后依次递交给IP层发送出去。接收端传输层等待属于同一应用程序的所有数据单元到达,对它们进行差错校验,最后将整个数据交付给应用程序。
第三,为了提供更可靠的传输服务,传输层还应该提供流量控制机制,例如数据的确认、重传等,以保证数据在两个应用程序之间递交的有效性。

为什么提出UDP和TCP?
1、同一个设备上可能运行多个应用,所有设备IP地址为这些程序所共享。为了识别每一个应用需要进一步的编制机制。
2、有些应用需要功能完备,面向连接的可靠服务。TCP实现
3、有些应用仅仅需要一种快色的信息传输方式,甚至容许丢失一些数据。UDP实现。
为了解决上述3个问题,提出了新的运输层协议TCP/UDP来负责主机到主机的运输功能。

1 UDP(User Datagram Protocol)用户数据报协议

UDP为两个应用程序提供了简单的数据交互方式,有着很高的数据递交效率,在局域网环境或在视频播放领域有着广泛的应用。另一方面,UDP也是实现多种著名上层应用协议的基础,例如DNS 、DHCP,IGMP, SNMP等协议都使用UDP传送协议数据。

UDP属性:

  • UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用 UDP而使用一种可靠协议如TCP。
  • UDP是一个无连接协议,也就是在传输数据之前源端口和目标端口不能建立连接。要传输时候,就简单抓取应用程序数据,丢到网络上面。接收端,UDP把每个消息放在队列中,应用程序每次从队列中读一个消息段。
  • 由于不需要建立连接,因此不需要维护连接状态。一台服务器可以向多个客户机传输相同的消息。
  • UDP首部比较短8字节,相对于TCP的20字节信号包的额外开销很小。
  • 面向报文,发送方UDP程序传输下来报文,添加首部后就向下传输,不拆分也不合并,保留报文边界。
  • UDP属于不可靠协议,但是对于屏幕显示股票,显示航空信息等待,丢失了一帧也没问题,在几秒之内新的消息就会替换。也广泛应用在多媒体中,大多数因特网电话软件产品都运行在UDP之上,QQ聊天,视频,网络电话,迅雷。

这里写图片描述
这里写图片描述
- 16为端口
表示发送进程和接受进程。服务器一般通过知名端口号来识别。
这里写图片描述
这里写图片描述
UDP 8000端口:腾讯QQ
TCP 1521端口:Oracle数据库服务。等等

  • 16位UDP长度
    UDP首部和UDP数据的长度,最小值为8字节,因此发送一份0字节的UDP数据报是OK的。
  • 16位UDP校验和
    这里写图片描述
    IP校验仅仅覆盖IP首部,UDP数据报包含12位伪首部,伪首部是IP首部的一些字段。目的是为了让UDP两次检查数据是否已经到达的正确的目的地。
  • 数据
    包含应用层协议头部和用户发出的数据,在这里应用层用户还可以自定义协议处理。

2 TCP(Transmission Control Protocol )传输控制协议

1、在传输层协议中, UDP只为应用程序提供了一种无连接的、不可靠的传输服务。而在很多情况下,应用程序期望传输层能提供可靠的服务,在上层应用想把大量的顺序数据(例如一个文件)发送到另一台主机时,使用UDP会显得非常不方便。 UDP能够运载的数据以报文作为单位,各个报文之间互不相关,UDP每收到一个报文就递交给上层用户,通常这些报文存在着顺序混乱、重复等现象。应用程序要得到完整的数据,就得自己去实现一系列的控制机制,对UDP可能出现的差错进行检测和恢复,这给程序开发人员带来很大的编程难度,而另一方面,用户程序的运行效率也会降低。
2、在对可靠性要求很高的场合下,使用TCP提供的传输性能是很合适的,TCP将两个进程间传递的数据看作数据流的形式,两个先后发出的TCP报文虽然在网络中也是互不相关的传输,但是它们携带的数据之间却具有关联关系,因为TCP给传输的每个字节数据一个唯一的编号。在接收端,所有数据将按照编号被顺序组织起来,当所有数据接收成功后,TCP才把数据递交给应用层。应用层不必担心报文的乱序、重复、丢失等问题,TCP采用正面确认以及重传等机制保证数据流能全部正确到达。TCP提供下面机制保证数据报文的正确及完整性。

  • 握手机制:传输层需要为通信的双方建立通信时的连接机制,而 UDP提供的是无连接的服务,使用UDP通信时,双方并不需要建立稳定的连接,具有正确目的IP地址和目的端口号的UDP报文都会被递交给对应的上层应用程序,而对于报文的源端却没有太多限制。而在TCP中,协议为通信的双方提供了完善的连接建立机制和连接断开机制,一个TCP连接必须完整地记录通信双方的IP地址和端口号,就像在现实中打电话一样,必须有个明确的通话双方。
  • 正面确认与重传:为了确保数据报交付的有效性,TCP通信双方必须进行交互,以通告数据接收结果。在接收方,每收到一个报文后,它都会向发送方返回一个确认,而发送方在发送完一个报文后,必须等待对应的确认返回,同时发送方为每个报文启动一个定时器,如果在指定的时间内没有收到确认,发送方会认为报文发送失败,并重传报文,这就是TCP确认和重传机制。
  • 缓冲机制:在发送方,上层应用程序可能会将各种各样、大小各异的数据流交给TCP发送,TCP提供了完整的缓冲机制未提高传送效率并减少网络中的通信量,在少量数据发送时,协议通常会短暂延迟数据的发送时间,以缓冲到更多的用户数据,以组成一个最佳大小的报文段发送出去。对于每个发送出去的报文,TCP不会马上删除它们,而是将它们保存在内部缓冲中,以便需要的时候重传,只有等到对应的确认到达后,报文才会在缓冲区中被删除。同理,接收方也必须维护良好的缓冲机制,因为底层的报文可能是无序到达的,这里需要把各个无序报文组织为有序数据流,重复的报文
    会被删除。
  • 全双工通信:一旦两个应用程序之间建立起了连接关系,那么它们之间就是对等的,任何一方都可以向另一方发送数据,即数据可以是双向流动的,因此称TCP连接为全双工连接。全双工通信为确认机制带来了方便,通常TCP中的正面确认通过捎带的方式来实现,即接收方把确认信息放到反向传送的数据报文中,不必单独为确认信息申请一个反向报文,捎带机制减少了网络中的通信流量。当然,任何一方都可以声明停止数据发送,此时该方向上数据流就关闭了,该方向上的接收方不会再收到任何数据。连接虽然可以在一方关闭,但另一个方向上的数据仍然是保持流动的,此时,称这种连接为半双工连接。
  • 流量控制:流量控制也属于双方之间的控制信息,在很多时候,双方之间的流量信息交互是必要的,如果发送方发送报文的速度很快,而接收方处理报文的速度很慢,这时在接收方会发生数据丢失的情况,丢失最终导致发送方的重传,这使得整个连接的通信效率降低;另一方面,如果发送方每次只发送很少量的数据,然后等待确认的返回,而接收方在处理完数据并返回确认后,又继续等待接收后续的数据,这样不管是接收方还是发送方在很多时候都会处于等待状态,连接的效率也无法得到提升。TCP中引进了滑动窗口的概念来进行流量的控制,接收数据的一方可以向发送方通告自己接收窗口的大小,告诉发送方自己的接收能力,而发送方可以根据这个窗口的大小来发送尽可能多的数据,同时又保证了接收方能够处理这些数据。为了让双方都不会空闲也不会过载,达到一种适中状态。
  • 差错控制:正面确认和重传都属于差错控制的范畴,此外TCP和其他协议一样,也采用校验和的方式来验证数据的有效’性:同时,TCP的缓冲机制会对接收的数据进行检查,对重复的报文进行丢弃,对失序的报文段进行重组,对丢失的报文通知发送方进行重传。TCP最终递交给应用程序的数据应该是顺序的、无传输差错的完整数据。
  • 拥塞控制:报文在连接双方之间的交互是通过网络进行的,而拥塞控制考虑的就是网络的传输状况。通常
    在路由器发送拥塞时,它会丢弃掉不能处理的数据报,这将导致发送方因接收不到确认而重传,重传的数据同样不会成功,且重传会使得路由器中拥塞更为严重。拥塞发生时报文被丢弃,但是发送方不会得到任何报文丢失的信息,因此,发送方必须实现一种自适应机制,及时检测网络中的拥塞状况,自动调节数据的发送速度,这样才能提高数据发送的成功率。在TCP中,引进了一个名为拥塞窗口的概念,与滑动窗口相似,拥塞窗口也是发送方控制数据发送速度的方式之一。
  • 其他有效机制:TCP各种实现也会采用很多其他机制以提高TCP连接的有效性、数据交互的高效性和可靠性。常见的有糊涂窗口现象与糊涂窗口的避免、零窗口探测机制、连接保活机制等。

TCP提供面向连接的,可靠的字节流服务。在彼此交换数据之前必须建立一个TCP连接。TCP仅有两方彼此通信。TCP协议传输数据时,每发出一个数据包都要求确认。如果有一个数据包丢失,就收不到确认包,发送方就知道应该重新发送这个数据包。
TCP将用户数据打包成报文段,它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制。

这里写图片描述
这里写图片描述

  • 16位源端口号和目的端口号
    寻址发送和接收的应用程序。有时候一个IP地址和一个端口号称为一个插口(socket),插口对(socket pair)包含有客户IP地址,客户端口号,服务器IP地址,服务器端口号,可唯一确定互联网络的TCP连接双方。这和UDP协议中的端口号定义相同。
  • 32位序号
    标识了从TCP发送端到TCP接收端的数据字节编号,它的值为当前报文段中的第一个数据的字节序号。在接收方,先计算出数据区数据的长度,然后使用首部中的序号子段,就能计算出报文最后一字节数据的序号。
  • 32位确认序号
    32 位确认序号只有ACK标志为1时才有效,它包含本机所期望收到的下一个数据字节序号,确认常常和反向数据一起捎带发送。确认序号应当是上次己成功收到数据字节序号加1,即如果接收方成功接收了对方发送的数据序号A,则返回的确认应为 A+1. 当一个TCP连接被正确建立后,报文首部中的ACK子段总是被设置为1。
    这里写图片描述
  • 4位首部长度
    给出首部长度,以4字节为单位。之所以需要这个长度是因为选项字段长度根据数据内容在变化。由于这个字段有4 bit,因此TCP最多有60字节的首部,如果没有任何选项字段,首部长度应该为5(20字节)。
    -保留字
    为了将来应用而保留未用
  • 6个标识bit
    多个位可以同时置1,用于告诉接收方如何解释报文内容。
    UGR:如果置1,紧急指针。urgent pointer
    ACK:如果置1,确认序号有效
    PSH:如果置1,接收方应该尽快将报文交给应用层
    为了提高网络的吞吐量,通常实行缓存技术,在缓存区积累足够的八位组报文段长度再发送出去,这降低了由报文段仅仅携带少量数据而造成的过高负载。但是在一些交互终端应用中,用户希望敲击键盘指令,就可以立即得到响应。所以TCP提供的Push操作。
    RST:如果置1,复位重新连接
    SYN:如果置1,发起连接,同步序号
    FIN:如果置1,终止连接
  • 16位窗口大小
    窗口字段指定缓冲区大小,通知对方自己可用缓冲区大小(字节为单位),发送方根据这个值来调整发送窗口大小。
    窗口提供可靠传输和流量控制。所谓流量控制意思就是缓冲区大小的问题。如果接收方缓冲区快要满了,则发出小的窗口通告值。极端情况下,接收方使用0通告值停止所有传输。等缓冲区空间可用之后,接收方通告一个非0的窗口值再次触发数据流。
    为了获得可靠性,发送方送出一个分组之后,等待相应的确认而不发送下一个分组。这样当网络延迟严重时候,简单的肯定确认就浪费了大量的宝贵资源。
    滑动窗口协议就是为了提高数据流传输的效率,是一种更加复杂的确认机制,允许再发送方等待确认之前还可以发送多个分组。
    这里写图片描述
    随着确认的消息不断到达,窗口也不断地向后滑动。全双工的运行,可能在发的时候,确认消息已经到达,所以利用滑动窗口很好的利用了全双工特性。
  • 16位校验和
    校验和计算是必选的,校验和包含了伪首部,TCP首部和TCP数据,发送端计算和存储,接收端进行验证
  • 16位紧急指针
    只有当URG置1的时候,才有效。紧急指针是正偏移量,和序号字段中的值相加表示紧急数据最后一个字节序号。
  • 选项
    TCP使用选项字段来和另一端的TCP软件进行协商,指定本端所能接收报文段最大值MSS。例如一个嵌入式系统仅仅具有几百字节缓冲,却需要和超级计算机通信,可以协商一个MSS来限定报文段大小。
    这里写图片描述
  • 数据
    数据部分是可选的,在连接建立和终止时候,双方仅仅交换TCP首部
    则是上层应用程序协议的数据。

3 TCP连接的建立和终止

1、TCP三次握手

这里写图片描述
(1) 客户端发送一个SYN标志置1的TCP报文段,报文段首部指明自己的端口号及期望连接的服务器端口号,通常服务器端口号为一个熟知端口号(例如HTTP服务器的端口号为80) ,客户端选择的端口号通常为一个短暂端口号,可以由 TCP软件自动分配。同时在报文段中,客户端需要通告自己的初始序号ISN (这里假设为200)。除此之外,这个报文中还可以携带一些选项字段,最大报文段大小、窗口扩大因子,选项将客户端的一些连接属性通告给服务器。注意,本报文段中ACK标志为 0 ,因此它的确认号子段和通告窗口大小字段都会被视为无效。
(2) 当服务器接收到该报文并解析后,返回一个SYN 和ACK标志置1的报文段作为应答。ACK为1表示该报文段包含了有效的确认号,这个值应该是客户端初始序列号加 1 (即201) 。另一方面,SYN标志表明服务器响应连接,并在回应报文中包含服务器自身选定的初始序号ISN(这里假设为500,服务器可以在这个报文段中加上选项子段,告诉客户端自己的连接属性,同时报文首部中的窗口大小也有效,它向客户端指明自己的接收窗口大小。
(3) 当客户端接收到服务器的SYN应答报文后,会再次产生ACK置位的报文段,该报文段包含了对服务器SYN报文段的有效确认号,该值为服务器发送的ISN 加1(即501),同时,该报文段中还包含了有效的窗口大小,用来向服务器指明客户端的接收窗口大小。当服务器接收到(3)中的这个ACK报文后,服务器和客户端之间的连接就建立起来了,它们双方都获得彼此的窗口大小、初始序列号、最大报文段等信息。
当一端为建立连接而发送了它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每一个连接都将具有不同的ISN。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。

通常一端发起握手,另外一端等待连接。但是握手协议被精心的设计成双方同时试图连接也能正常工作。因此连接可以由一方或双方发起。一旦建立连接,数据就可以双向对等的流动,没有所谓的主从关系。
三次握手协议完成两个功能:确保连接双方都做好了传输数据的准备(双方都可以收发),而且使双方统一了初始序号。

TCP为什么需要三次握手,二次或者四次不可以吗?
以下答案截图转自知乎大神。
这里写图片描述

2、TCP四次断开

这里写图片描述
通过4次关闭操作,可以使TCP通信的两个程序结束会话。

(1) 首先,当客户端应用程序主动执行关闭操作时,客户端会向服务器发送一个FIN标志置1的报文段,用来关闭从客户端到服务器的数据传送,假设该报文段序号子段值为x 。
(2) 当服务器收到这个FIN报文段后,它返回一个ACK报文,确认序号为收到的序号加1(即x+1)并告知应用程序,已经没有数据从客户机发送数据过来了,当处理完了这些任务之后,赶紧发送一个FIN报文给客户机。和SYN一样,一个FIN将占用1个序号。当客户端接收到这个ACK后,从客户端到服务器方向的连接就断开了
(3)当服务器结束处理,并将必要数据返回给客户机之后,服务器TCP向其上层应用程序通告客户端的断开操作,这会导致服务器程序关闭它的连接,同样,此时一个FIN标志置1的报文段将被发送到客户端,假设序号为y。
(4) 客户端也会返回一个ACK报文段(y+1)作为响应,以完成该方向连接的断开操作。在可能的情况下,第(2) 和(3)步骤的报文可以合并在一起发送,但这种情况比较少见,因为它要求服务器程序在收到客户端的FIN包后,立即结束自己的操作并也执行关闭操作。

为什么需要四次断开?
最本质的原因在于TCP是全双工,数据是双向流动的,没有所谓的主从关系。客户机请求断开,只是客户机不会再向服务器发送数据了。这个时候服务器还可以继续处理客户机之前发送上来的数据,然后返回给客户机,四次断开就给服务器留下了一个处理尾部数据的时间,当服务器数据全部处理完了,并且也返回给客户机了,这个时候服务器就同样可以发送FIN信号了。这个完全符合我们生活之中实际的例子。

最大报文段长度

MSS表示TCP传往另一端的最大块数据长度。当一个连接建立时,连接双方都要通告各自的MSS。MSS一般是MTU(链路层最大传输单元)减去IP首部、TCP首部长度。

TCP半关闭

这里写图片描述
一遍调用shutdown之后,另外一边还是可以继续发送数据,并且这端也可以继续响应数据。

3、TCP复位操作

在正常情况下,通信的双方通过使用关闭连接的握手过程来结束一个连接,但是在连接出现异常的情况下(例如TCP软件在检测到一个SYN报文段请求连接的端口在本地并不存在时),TCP可以直接中断这个连接,这就是连接的复位。复位连接时,发送方将发送一个RST标志被置1的报文段,接收方对复位报文段的处理是直接终止该连接上的数据传送,释放发送、接收缓冲,并向应用程序通知连接复位。

4、TCP状态图

这里写图片描述

这里写图片描述
图中有两条最经典的状态转换路径(服务器正常状态变迁和客户机正常状态变迁),而TCP绝大部分的状态转换都发生在这两条路径上。
这里写图片描述

客户机正常状态变迁:
当客户端申请连接时,在客户端通过发送一个SYN报文段,主动向服务器申请一个连接,在报文发出之后客户端进入SYN_SENT状态等待服务器的ACK和 SYN报文返回,当收到这个返回后,客户端对服务器的SYN进行确认,然后自身进入ESTABLISHED状态,与前面描述的三次握手过程完全一致。
当客户端申请断开连接时,它发送FIN报文给服务器申请断开连接,当FIN发送后,客户端进入FIN_WAIT_1 状态等待服务器返回确认;当收到确认后,表明客户端到服务器方向的连接断开成功,此时客户端进入FIN_WAIT_2状态等待服务器到客户端方向发送连接断开请求(四次断开中的(3)),等待等待……;当客户端收到服务器的FIN报文时,表明服务器向客户端发送断开连接请求,此时,客户端向服务器返回一个ACK,并进入TIME_WAIT状态,在该状态下等待2MSL(MSL报文最大生存时间,在很多实现中取为 30秒,在LwIP中取为60秒)时间后,客户端进入初始的CLOSED状态。在连接处于2MSL 等待时,任何迟到的报文段将被丢弃。上述过程与断开连接的四次握手过程完全相符。
TIME_WAIT状态很重要,协议中是这样描述的:当TCP执行一个主动关闭,并发出最后一个 ACK后,该连接必须在TIME_WAIT状态停留2倍MSL的时间。这样可让TCP保证在客户机给服务器最后响应的这个ACK丢失的情况下服务器那方重新发送FIN(服务器端FIN响应超时,因为客户端发送的ACK丢失了,那么服务器将重新发送FIN)信号,这时候由于客户机停留在TIME_WAIT状态,维护了对应的响应状态信息,以允许客户机重新发送ACK响应信号,提高了容错率。处与TIME_WAIT等待状态的TCP端口此刻还不能被其他新连接所使用。

以上是客户机正常状态变迁的描述,其中timewait状态是为了确保最后一个ack可以准确到达对方。

服务器正常状态变迁:服务器建立连接一般属于被动过程,它首先打开某个熟知端口,进入LISTEN状态以侦听客户端的连接请求。当服务器收到客户端的SYN连接请求,则进入SYN_REV状态,并向客户端返回一个ACK及自身的SYN报文;此后,服务器等待客户端返回一个确认,收到该ACK后,服务器进入ESTABLISHED状态,在该状态下客户端可以和服务器进行稳定的数据交换。可见,连接建立的过程和前面描述的三次握手过程完全一致。当服务器收到客户端发送的一个断开连接报文FIN时,则进入CLOSE_WAIT状态,并向上层应用程序通告这个消息,同时向客户端返回一个ACK,此时客户端到服务器方向的连接断开成功;此后,当服务器上层应用处理完毕相关信息后会向客户端发送一个 FIN报文,并进入LASK_ACK状态,等待客户端返回最后ACK,当收到返回的ACK后,此时服务器到客户端方向的连接断开成功,服务器端至此进入初始的CLOSED状态。此过程与断开连接的四次握手过程完全相符。

以上是服务器正常状态变迁的描述。

一些特殊状态变迁:
这里写图片描述
这里写图片描述
普通协议栈,并没有实现这种情况,所以一般可以忽略不计,假如以后遇到,那么可以再考虑考虑的。

5、TIME_WAIT状态存在必要性

MSL(Maximum Segment Lifetime)报文段最大生存时间。
TCP要求,首先发出FIN的一端(客户和服务端都可能),在通信双方都完全关闭连接之后,仍然要保持在TIME_WAIT状态直至两倍的报文段最大生存时间( MSL)。 MSL的建议值是120秒,也即处于TIME_WATE状态要达到4分钟。当连接处于TIME_WAIT状态时,同一连接 (即客户I P地址和端口号,以及服务器 I P地址和端口号这4个值相同)不能重复打开,内存没能释放导致Socket描述符不能在重复使用而浪费资源。
假如客户端首先发出FIN,这称为主动关闭,因而TIME_WAIT状态出现在客户端。在这个状态延续期内。
1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2. 可靠的关闭TCP连接。在主动关闭方发送的最后一个ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

其他一些应用程序,特别是WWW中的HTTP,要求客户程序发送一个专门的命令来指示已经将请求发送完毕 (而不是像我们的客户程序那样采用半关闭连接的办法 );接着服务器就发回应答,紧接着就是服务器的FIN。然后客户程序再发出FIN。这样做与前面所述的不同之处在于,现在的TIME_WAIT状态出现在服务器端而不是客户端对许多客户访问的繁忙服务器来说,需要保留的状态信息会占用服务器的大量内存。因此,当设计一个事务性客户服务器应用程序时,让连接的哪一端关闭后进入TIME_WAIT状态值得仔细斟酌。我们还将看到,TCP可以让TIM E_WAIT状态的延续时间从240秒减少到大约12秒。

再次详解确保TCP正常关闭:
这里写图片描述
这里写图片描述
这里写图片描述

再次详解确保过时的重复报文段时效:
这里写图片描述
这里写图片描述
这里写图片描述

如果终止一个客户程序,并立即重新启动这个客户程序,则这个客户程序将不能重用相同的端口(因为这个端口正处于TIME_WAIT状态),这对客户程序不会带来什么问题,因为使用本地端口,而并不关心这个端口号的什么。然而对于服务器,因为服务器使用熟知的端口。

5、TIME_WAIT_2状态

在TIME_WAIT_2状态我们已经发出了FIN,并且另一端已经确认了,这个时候另外一段处于CLOSE_WAIT状态,这两端可能一直处于这个连接,除非另外一段应用程序决定进行关闭。

复位报文段

当连接请求到达时候,目的端口没有进程正在监听,对于TCP则产生一个复位报文段。

同时关闭

这里写图片描述

TCP服务器设计

6、服务器端如何解决过多的TIME_WAIT

4 应用层杂项协议

下面是一些客户机向对应服务器要相关数据的协议。具体对应的报文协议格式,在需要的时候再进行深入研究。

DHCP(Dynamic Host Configuration Protocol)

动态获取IP地址,那么肯定需要对应的DHCP服务器。

如果计算机保持位置不变,而且管理员有足够的IP地址为每台机器分配唯一的地址,静态分配将很好工作,但是如果计算机经常移动,或者实际计算机数目超过了可获得IP主机地址的情况下,静态分配将导致过量的开销,并且静态分配需要管理员手动输入,也极其的不方便。为此需要提出一种自动机制,那就是DHCP。

1、DHCP可使计算机通过报文获取所需要的全部信息。除了IP地址还有可以获取子网掩码。
2、允许计算机快速动态地获取IP地址。这个需要管理员配置相应的DHCP服务器。
DHCP允许一台主机在无人干预的条件下获得通信的全部参数,所以DHCP允许自动配置,但是自动配置功能受限了DHCP服务器的管理人员。管理人员可以设置服务器分配的方式。
DHCP服务器将地址在有限时期内租给一个客户使用,指定对应的租用期,租用期间服务器不会将同一个地址给其他客户,租用期结束,客户必须更新租期或者停止服务。
为了使用DHCP,一台主机通过把报文广播给本地网上服务器而成为客户,然后该主机收集服务器提供的地址,从中选择一个地址并验证服务器是否接受。

DNS(域名系统)

通过服务器域名得到其IP地址,那么肯定需要DNS服务器。

DNS(Domain Name System,域名系统),是因特网上作为域名和IP地址相互映射的一个分布式数据库(由特殊机构管理),能够使用户更方便的访问互联网,而不用去刻意记住32位IP地址。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
通过主机名得到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
2)动态映射,在静态映射不存在的情况下,客户机就会发送一个域名查询请求报文(报文格式不必清楚,了解运行思路即可)给相应的服务器,去要主机名对应的IP地址。

HTTP(万维网)

5、通俗表示各层关系

用一个形象的例子来说明上面的结构和它们之间的关系,希望有助于你的理解。网上购物大家很熟悉了,就在这里下刀:住在成都的小张在网上购买了一本自己期待已久的书,让我们来看看,远在广州的图书卖家小李是怎样将这本书送到小张子里的。首先在双方达成购买意向后,小张和小李约定,通过A 快递公司来运送这本书,因为A 的运送速度能够满足小张的要求、且安全性在行业内赞誉有加:小李立即打电话联系A 快递公司的快递员小明,小明火速赶往小李处,对书进行了检查包装,在包装上填好了物品名称、收货人地址等信息,并且说到”放心,我们一定会将包裹准时安全的送到”,然后他将整个包裹送到了快递公司的物流处:物流处检查人员瞟了一眼包裹后,从收货人信息中看到,这是要发往成都的,所以在包裹上贴了一张大大的标签”目的地:成都”,并将包裹交给了发货人员,发货人员发现,恰好公司今天到成都的飞机还未起飞,因此包裹顺利上了飞机:经过数小时的飞行,包裹到达了成都机场:成都处A 快递公司物流工作人员己在这里等候多时,他们将包裹取出运送回公司,在查看了包裹上的详细地址后,将该包裹送到了快递员小亮于里,因为他们知道,包裹的目的地在小亮负责配送的区域内:小亮根据包裹的地址信息,顺利将包裹送到了小张处,并当面将包裹打开,将书交给小张:小张拿到书后,高兴地翻阅了起来。通过整个过程,小张准确又及时地收到了小李发送过来的书籍。

在上面的过程中,买卖双方小张和小李处在最上层,是应用层,他们依赖于快递人员小明和小亮的服务:快递人员小明和小亮是传输层,负责对书的检查、打包等工作,并填入相关个人信息:快递公司物流处属于网络层,它们根据用户个人信息决定包裹发到哪里,怎样被发送:货运飞机处于网络接口层,它以自己的方式完成物流处递交来的包裹的运输。如果从广州到成都没有一种方式可以直达,那么广州的物流处可能先将包裹通过铁路的方式运到武汉,驻武汉的快递公司物流处工作人员发现,这个包裹不是给我们武汉的,而是给成都的,所以他们又决定以河运的方式将包裹运送至重庆,重庆处物流工作人员发现这个包裹也不是给我们的,所以它们又通过陆运将包裹送到了最终目的地成都。空运、河运、海运都属于不同的网络接口方式,它们以各自的方式完成包裹的运送:物流处是网络层,它们决定了包裹是派送还是继续转发,以及以什么样的方式转发。

猜你喜欢

转载自blog.csdn.net/u010710458/article/details/77652679