• TCP/IP入门指导


    本文翻译自https://tools.ietf.org/rfc/rfc1180.txt,包括原文90%内容,删减最后的网络应用介绍章节。这是我看到过的最简单易懂又不失核心原理的文章。

    一 介绍
    这篇文档仅仅包括TPC/IP协议的要点描述,但是它是TPC/IP技术的基石。这篇文档使用的例子基于UNIX TCP/IP环境,其中技术要点在所有实现了TCP/IP协议的平台通用。

    二 TCP/IP概述
    “TCP/IP”通常表示与TCP和IP协议相关的任何东西。包括协议,应用,甚至网络媒介。协议方面,比如:UDP/ARP/ICMP,应用方面,比如:TELNET/FTP/RCP。一个更准确的术语应该是“网络技术”,一个使用网络技术的网络称作“Internet”。

    2.1 逻辑结构
    要明白TCP/IP,必须先理解下面的逻辑图:

                         ----------------------------
                         |    network applications  |
                         |                          |
                         |...   | /  ..   | /  ...|
                         |     -----      -----     |
                         |     |TCP|      |UDP|     |
                         |     -----      -----     |
                         |               /         |
                         |         --------         |
                         |         |  IP  |         |
                         |  -----  -*------         |
                         |  |ARP|   |               |
                         |  -----   |               |
                         |         |               |
                         |      ------              |
                         |      |ENET|              |
                         |      ---@--              |
                         ----------|-----------------
                                   |
             ----------------------o---------
                 Ethernet Cable
    
                      Figure 1.  Basic TCP/IP Network Node

    这是一个互联网上计算机内部的网络分层逻辑图。每个拥有网络的计算机内部都是这种逻辑图。

    o:表示网卡;
    @:表示mac地址;
    *:表示ip地址。

    2.2 术语
    数据报文在不同的协议栈时有不同的名称。比如:如果数据报文在网卡驱动中,称作以太网帧(Ethernet frame);如果数据报文在网卡驱动和IP模块之间,称作IP包(IP packet);如果数据报文在IP模块和UDP模块之间,称作UDP报文(UDP datagram);如果数据报文在IP模块和TCP模块之间,称作TCP段(TCP segment);如果数据报文位于网络应用内部,称作应用数据(application message)。
    这些定义是不完善的,且不同的出版物都有不同的说法。更准确的定义详见RFC1122,section 1.3.3。
    直接与网卡通信的软件称作“驱动”,可以与驱动,应用通信的软件称作模块。
    驱动,模块,以太网帧,IP包,UDP报文,TPC段,应用数据会在这篇文档中使用。

    2.3 数据流
    让我们分析下图1中数据经过协议栈的过程。
    对于使用TCP的应用,数据在应用与TCP模块间传递,对于使用UDP的应用,数据在应用与UDP模块间传递。FTP是典型的TCP应用,它的协议栈是FTP->TCP->IP->ETHERNET。SNMP是典型的UDP应用,它的协议栈是SNMP->UDP->IP->ETHERNET。
    TCP模块,UDP模块,网卡驱动就像是n-to-1的多路复用器,把多路应用输入数据输出到IP模块,或者1-to-n的解复用器。它们把来自IP模块的数据分发到多个应用。

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
             1   2 3 ...   n                   1   2 3 ...   n
                |      /      |                 | |      /       ^
                | |   /       |                 | |     /        |
             -------------   flow              ----------------   flow
             |multiplexer|    of               |de-multiplexer|    of
             -------------   data              ----------------   data
                  |            |                     |              |
                  |            v                     |              |
                  1                                  1
    
            Figure 2.  n-to-1 multiplexer and 1-to-n de-multiplexer

    网卡收到以太网帧后,根据以太网帧的类型,将报文送到ARP模块或者IP模块。 

    IP模块根据IP包协议类型,将其送到TCP模块或者UDP模块。
    UDP模块根据UDP头的端口号信息,将应用数据送到对应的应用程序,而TCP模块则根据TCP头的端口信息,将应用数据送到对应的应用程序。
    下行方向的多路服用比较简单,因为只有一条路径。每一层协议在报文中添加自己的协议头即可,以便对端计算机收到报文后可以解析报文。
    应用发出的数据经过TCP模块或UDP模块,然后经过IP模块,最终被网卡驱动发出。
    尽管互联网技术支持许多网络媒介,但是基于IP的网络中,以太网是最常见的物理网络。图1中的计算机有一个以太网接口,网卡中的6字节的MAC地址是识别以太网端口的唯一标识。同时,计算机拥有4字节的IP地址, IP地址在一个网络中必须是唯一的。

    2.4 双网口

                    ----------------------------
                    |    network applications  |
                    |                          |
                    |...   | /  ..   | /  ...|
                    |     -----      -----     |
                    |     |TCP|      |UDP|     |
                    |     -----      -----     |
                    |               /         |
                    |         --------         |
                    |         |  IP  |         |
                    |  -----  -*----*-  -----  |
                    |  |ARP|   |    |   |ARP|  |
                    |  -----   |    |   -----  |
                    |         |    |   /      |
                    |      ------  ------      |
                    |      |ENET|  |ENET|      |
                    |      ---@--  ---@--      |
                    ----------|-------|---------
                              |       |
                              |    ---o---------------------------
                              |             Ethernet Cable 2
               ---------------o----------
                 Ethernet Cable 1
    
                 Figure 3.  TCP/IP Network Node on 2 Ethernets

    图3的计算机有两个MAC地址和两个IP地址。上图的IP模块可以理解为n-to-m的多路复用器或m-to-n的解复用器。

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
             1   2 3 ...   n                   1   2 3 ...   n
                | |      /    |                  | |      /       ^
                | |     /     |                  | |     /        |
             -------------   flow              ----------------   flow
             |multiplexer|    of               |de-multiplexer|    of
             -------------   data              ----------------   data
               / | |          |                 / | |             |
              /  | |          v                /  | |             |
             1   2 3 ...   m                   1   2 3 ...   m
    
            Figure 4.  n-to-m multiplexer and m-to-n de-multiplexer

    具有多个网络接口的IP模块比图1中的IP模块复杂很多,因为它能将报文转发的另一个网络。数据能够从任意网络接口进来,然后能从任意网络接口发送出去。

                               TCP      UDP
                                       /
                                      /
                              --------------
                              |     IP     |
                              |            |
                              |    ---     |
                              |   /       |
                              |  /     v   |
                              --------------
                               /         
                              /           
                           data           data
                          comes in         goes out
                         here               here
    
                Figure 5.  Example of IP Forwarding a IP Packet

    将一个IP报文发送到另一个网络的行为叫做“转发”。一个专门转发IP报文的计算机称作“路由器”。
    如上图所示,被转发的IP报文不需要经过TCP/UDP模块,所以一些路由器是没有TCP/UDP模块的。

    2.5 IP逻辑网络
    IP模块是互联网技术的关键。下行(向外发送)流量中,每个模块都会在报文中添加自己的协议头,与此相反,上行(接收)流量中,每个模块都会剥掉自己的协议头,直到送到应用程序。IP协议头中包括IP地址。
    基于物理网络,IP地址建立逻辑网络。不同物理网络的互联是“互联网”的由来。


    2.6 物理网络无关性
    IP层屏蔽了底层物理网络的差异,如果你发明了一个新的物理网络,只需要写好对应的驱动就能使用互联网。网络应用不受底层硬件变动干扰。

    2.7 Continue
    经过上面背景介绍,我们将回答下列问题:
    发送IP报文时,怎么确定目标计算机的MAC地址?
    多网卡计算机上,IP模块怎么知道应该从哪个网卡发送出去?
    不同网络(网段)的计算机怎么通信的?


    三 以太网
    本节简单介绍下以太网技术。
    一个以太网帧包括:目标地址、源地址、帧类型、数据。
    一个以太网MAC地址是6字节。每个网络设备都有唯一的以太网地址。
    以太网使用CSMA/CD技术,CSMA/CD特点:使用同一线缆通信的所有设备,同一时刻只有一个设备能发送,但是所有设备可以同时接收。如果两个设备在同一时刻准备发送数据,发送冲突就被检测到,两个设备会等待一段随机时间,然后重发。

    四 ARP
    发送IP报文时,怎么确定目标计算机的MAC地址?
    ARP(Address Resolution Protocol)协议用来获取IP地址对应的MAC地址。

    4.1 ARP Table
    通过查找一个表来获取IP地址对应的MAC地址,这个表被称作“ARP Table”。
    ARP Table有两列,一列表示IP地址,一列表示MAC地址。
    通过查找ARP Table匹配IP地址,来获取对应的MAC地址。

                      ------------------------------------
                      |IP address       Ethernet address |
                      ------------------------------------
                      |223.1.2.1        08-00-39-00-2F-C3|
                      |223.1.2.3        08-00-5A-21-A7-22|
                      |223.1.2.4        08-00-10-99-AC-54|
                      ------------------------------------
                          TABLE 1.  Example ARP Table

    4.2 典型转换场景
    网络应用,比如TELNET,发送应用数据到TCP模块,然后TCP模块发送对应的TCP报文到IP模块。IP模块向驱动传递报文时必须知道目标IP对应的MAC地址。

    4.3 ARP 报文
    ARP表的内容是怎么填充的呢?答案是,ARP表的内容在需要的时候被自动填充。
    当ARP表格匹配IP地址失败后,系统会做两件事:
    1)使用广播地址向外发送一个ARP请求报文
    2)将待发送的报文入队

    每个计算机都会接收广播报文,然后检查报文类型是ARP,就将ARP请求报文送到ARP模块。ARP请求报文的内容是“如果你的IP地址是xxx,请告诉我你的MAC地址”。ARP请求报文示例:

                    ---------------------------------------
                    |Sender IP Address   223.1.2.1        |
                    |Sender Enet Address 08-00-39-00-2F-C3|
                    ---------------------------------------
                    |Target IP Address   223.1.2.2        |
                    |Target Enet Address <blank>          |
                    ---------------------------------------
                         TABLE 2.  Example ARP Request

    ARP模块检查自己的IP地址和目标IP地址是否相同 ,如果相同,就会发送ARP回应报文,内容“我的IP地址和你请求的目标IP相同,我的MAC地址是yyy”。ARP回应报文示例:

                    ---------------------------------------
                    |Sender IP Address   223.1.2.2        |
                    |Sender Enet Address 08-00-28-00-38-A9|
                    ---------------------------------------
                    |Target IP Address   223.1.2.1        |
                    |Target Enet Address 08-00-39-00-2F-C3|
                    ---------------------------------------
                         TABLE 3.  Example ARP Response

    发送ARP请求的计算机收到ARP回应报文后,将报文送入ARP模块,ARP模块检查ARP回应报文内容,将请求IP地址与MAC地址填入ARP表。
    更新后的ARP表:

                       ----------------------------------
                       |IP address     Ethernet address |
                       ----------------------------------
                       |223.1.2.1      08-00-39-00-2F-C3|
                       |223.1.2.2      08-00-28-00-38-A9|
                       |223.1.2.3      08-00-5A-21-A7-22|
                       |223.1.2.4      08-00-10-99-AC-54|
                       ----------------------------------
                       TABLE 4.  ARP Table after Response

    接下来,通过查找ARP表得到目标IP地址的MAC地址,然后IP模块将报文发送到驱动层,报文被发送出去。

    发送网络报文的完整步骤:
    使用广播地址向外发送一个ARP请求报文
    将待发送的报文入队
    收到ARP回应报文,并更新ARP表
    使用ARP表得到待发送报文的目的IP对应的MAC地址
    网络报文被发送

    每个计算机上每个网络接口都有独立的ARP表。如果如果网络报文的目的IP在ARP表不存在,且也没有ARP回应,就丢弃这个网络报文。上层应用不能区分丢包的原因是因为IP错误还是物理链路错误。

    五 网络协议
    IP模块是网络技术的核心,而IP技术的本质是路由表。IP技术基于路由表项决定IP包的转发策略。路由表的内容由网络管理员决定,错误的路由表配置会导致网络瘫痪。
    明白了路由表就明白了网络互联。理解路由表是管理维护IP网络的基础。
    理解路由表的最好方式是先有一个概括的认识,然后认识学习IP网络地址,最后学习细节。

    5.1 直接路由
    下图中有三个计算机:A、B、C。每个计算机都有像图1一样的TCP/IP协议栈,每个计算机网络接口都有自己的MAC地址,IP地址。

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
                              A      B      C
                              |      |      |
                            --o------o------o--
                            Ethernet 1
                            IP network "development"
    
                           Figure 6.  One IP Network

    当A发往B的网络报文,报文IP头中的源IP是A的IP地址,以太帧头中的源MAC是A的MAC地址。同时,报文IP头中的目的IP是B的IP地址,以太帧头中的目的MAC是B的MAC地址。

                    ----------------------------------------
                    |address            source  destination|
                    ----------------------------------------
                    |IP header          A       B          |
                    |Ethernet header    A       B          |
                    ----------------------------------------
           TABLE 5.  Addresses in an Ethernet frame for an IP packet
                                  from A to B

    当B的IP模块收到从A传来的报文,它检查报文的目的IP是否与自己的相同,如果相同,就把报文送到上层协议处理。

    这种场景下,A与B的通信方式称作直接路由。


    5.2 间接路由
    下图显示了一个更真实的网络结构,它集合了通过路由器连接的三个子网。每个IP子网络有4个计算机,每个计算机都有自己的IP地址和MAC地址。

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
              A      B      C      ----D----      E      F      G
              |      |      |      |   |   |      |      |      |
            --o------o------o------o-  |  -o------o------o------o--
            Ethernet 1                 |  Ethernet 2
            IP network "development"   |  IP network "accounting"
                                       |
                                       |
                                       |     H      I      J
                                       |     |      |      |
                                     --o-----o------o------o--
                                      Ethernet 3
                                      IP network "factory"
    
                   Figure 7.  Three IP Networks; One internet

    D是路由器。它连接三个子网,所以它有三个IP地址和三个MAC地址。同时,它有3个ARP模块和3个网卡驱动,但是它只有一个IP模块。
    当A向B发送网络报文,过程就是上一节描述的直接路由。任何同一子网内的通信都是直接路由通信。
    但是,A与其它子网的计算机通信必须通过路由器D路由转发,这种通信方式称作“间接路由”。路由转发发生在IP层,与上层无关。
    如果A向E发送网络报文,源IP与源MAC都是A的,目的IP是E的,但是A需要向将报文发给D做转发,所以目的MAC是D的。

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
                    ----------------------------------------
                    |address            source  destination|
                    ----------------------------------------
                    |IP header          A       E          |
                    |Ethernet header    A       D          |
                    ----------------------------------------
           TABLE 6.  Addresses in an Ethernet frame for an IP packet
                             from A to E (before D)

    D的IP模块收到IP包后,检查目的IP,发现不是自己的IP地址,接着,将这个IP包发送给E。

                    ----------------------------------------
                    |address            source  destination|
                    ----------------------------------------
                    |IP header          A       E          |
                    |Ethernet header    D       E          |
                    ----------------------------------------
           TABLE 7.  Addresses in an Ethernet frame for an IP packet
                             from A to E (after D)

    总之,对于直接通信,源IP、源MAC都是发送方的,目的IP、目的MAC都是接收方的;对于间接通信,IP与MAC并没有这种配对关系。

    5.3 IP模块路由规则
    对于上层传递下来的IP包,IP模块决定是直接发送还是间接发送,并且IP模块要决定从底层哪个网口发送出去。这些决定都是通过路由表决策的。
    对于从网口收到的IP包,IP模块决定是把IP包送到上层协议栈还是转发出去。
    一个网络报文不能从接收它的端口发送出去。

    5.3 IP地址
    网络管理员基于计算机所在子网给计算机分配IP地址。IP地址一部分是网络地址,一部分是主机地址。比如之前使用的IP地址223.1.2.1,网络地址是223.1.2,主机地址是1。
    IP地址中哪部分表示网络地址,哪部分表示主机地址,是由4字节的网络掩码决定的,我们这篇文档使用C类IP地址,即网络掩码是255.255.255.0,前21bit表示网络地址,后8bit表示主机地址。
    IP地址空间被NIC(Network Information Center)管理,所有的连接到互联网的计算机必须使用由NIC分配的网络号。即使一个私人局域网,也应此规则限制,否则有与其它局域网冲突的风险。

    5.4 名字
    我们习惯用名称来表示计算机,而不是数字。一个叫做alpha的计算机可能拥有IP地址223.1.2.1。对于小型网络,hosts文件可以完成名称到地址的转换。对于大型网络这个转换文件存储在专门服务器中。转换文件大概内容:

       223.1.2.1     alpha
       223.1.2.2     beta
       223.1.2.3     gamma
       223.1.2.4     delta
       223.1.3.2     epsilon
       223.1.4.2     iota

    第一列表示IP地址,第二列表示计算机名字。
    比如delta(图7中的计算机D)有三个IP地址,但是转换文件只有一个条目,这种情况不影响delta的通信能力,delta收到报文后会解析报文目的IP,只要与自己的任意IP匹配就可以接收报文。
    IP子网络也可以被命名,比如有三个IP子网络,IP子网络与网络名的对应文件大概像这样:

       223.1.2     development
       223.1.3     accounting
       223.1.4     factory

    第一列表示IP子网络的网络号,第二列表示IP子网络的名称。
    从这个例子可以看出alpha是“development”子网的第1号计算机,beta是第2号计算机。
    上述hosts文件对于普通用户是足够的,但是网络管理员可能添加下面的信息到hosts文件:

       223.1.2.4     devnetrouter    delta
       223.1.3.1     facnetrouter
       223.1.4.1     accnetrouter

    这三行把delta的所有IP都赋予了一个名字,事实上第一行的delta和devnetrouter含义相同,一般使用时delta是通用名称,其它三个名称仅在管理路由表时使用。

    5.5 IP路由表
    IP模块如何知道将报文从哪个网口发送出去?
    IP模块通过匹配路由表的网络地址与目的IP的网络地址,确定从哪个端口发送出去。
    路由表每一行表示一条路由,路由表的主要内容:IP网络号、直接路由/间接路由标记、路由器IP地址、网口号。IP模块发送报文时需要查询路由表。
    大多数计算机上可以通过route命令修改路由表。

    5.6 直接路由细节

                            ---------         ---------
                            | alpha |         | beta  |
                            |    1  |         |  1    |
                            ---------         ---------
                                 |               |
                         --------o---------------o-
                          Ethernet 1
                          IP network "development"
    
                   Figure 8.  Close-up View of One IP Network

    上图中,Alpha中的路由表:

         --------------------------------------------------------------
         |network      direct/indirect flag  router   interface number|
         --------------------------------------------------------------
         |development  direct                <blank>  1               |
         --------------------------------------------------------------
                      TABLE 8.  Example Simple Route Table

    上图中的路由表可以用netstat –r看到。
    为了方便讨论,把上图的网络号名称换成网络号:

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
         --------------------------------------------------------------
         |network      direct/indirect flag  router   interface number|
         --------------------------------------------------------------
         |223.1.2      direct                <blank>  1               |
         --------------------------------------------------------------
               TABLE 9.  Example Simple Route Table with Numbers

    alpha向beta发送IP报文,IP报文的目的IP是beta或223.1.2.2,IP模块在路由表中匹配目的IP的网络号,发现与路由表的第一个条目匹配。

    路由表的其它信息表示:alpha到beta的逻辑网络通过端口1直接路由。接着通过ARP模块将beta的IP地址转换成MAC地址,然后交由网卡向外发送。

    如果一个应用向一个不能在路由表中匹配的IP地址发送数据,IP模块将丢弃IP报文,有些计算机可能会回复一个“网络不可达”的错误消息。

    5.7 间接路由细节

    RFC 1180                   A TCP/IP Tutorial                January 1991
    
    
              ---------           ---------           ---------
              | alpha |           | delta |           |epsilon|
              |    1  |           |1  2  3|           |   1   |
              ---------           ---------           ---------
                   |               |  |  |                |
           --------o---------------o- | -o----------------o--------
            Ethernet 1                |     Ethernet 2
            IP network "Development"  |     IP network "accounting"
                                      |
                                      |     --------
                                      |     | iota |
                                      |     |  1   |
                                      |     --------
                                      |        |
                                    --o--------o--------
                                        Ethernet 3
                                        IP network "factory"
    
                 Figure 9.  Close-up View of Three IP Networks

    上图中,alpha中的路由表:

     ---------------------------------------------------------------------
     |network      direct/indirect flag  router          interface number|
     ---------------------------------------------------------------------
     |development  direct                <blank>         1               |
     |accounting   indirect              devnetrouter    1               |
     |factory      indirect              devnetrouter    1               |
     ---------------------------------------------------------------------
                          TABLE 10.  Alpha Route Table

    上图中的路由表可以用netstat –r看到。

    为了方便讨论,把上图的网络号名称换成网络号:

      --------------------------------------------------------------------
      |network      direct/indirect flag  router         interface number|
      --------------------------------------------------------------------
      |223.1.2      direct                <blank>        1               |
      |223.1.3      indirect              223.1.2.4      1               |
      |223.1.4      indirect              223.1.2.4      1               |
      --------------------------------------------------------------------
                   TABLE 11.  Alpha Route Table with Numbers

    aplpha给epsilon发送IP报文。IP报文的目的IP是epsilon或223.1.3.2,IP模块在路由表中匹配目的IP的网络号,发现与路由表的第二个条目匹配。

    这个条目表示:目的子网223.1.3可以通过devnetrouter间接到达。alpha的IP模块将devnetrouter的IP地址翻译成MAC地址,作为报文的目的MAC,并把这个IP报文发送给路由器delta。同时,报文的目的IP还是223.1.3.2。

    Delta收到这个IP报文后,IP模块发现目的IP不是自己的IP,所以这个IP报文需要转发。

    Delta的IP模块解析目的IP的网络号(223.1.3)与自己的路由表匹配,匹配到第2条目。表示223.1.3子网可以通过网口3直接到达,通过ARP模块将目的IP翻译成MAC地址,通过网口3发送出去。

     ----------------------------------------------------------------------
     |network      direct/indirect flag  router           interface number|
     ----------------------------------------------------------------------
     |development  direct                <blank>          1               |
     |factory      direct                <blank>          3               |
     |accounting   direct                <blank>          2               |
     ----------------------------------------------------------------------
                         TABLE 12.  Delta's Route Table

    IP报文到达epsilon,报文目的IP与epsilon的IP地址匹配,所以epsilon的IP模块将报文上送。

    5.8 路由总结

    IP报文在大型网络中需要经过许多路由器,发送计算机根据自己的路由表决定第一个路由器,然后剩下的每个路由器决定报文的下一跳(下一个路由器)。最终到达目的计算机。

    六 UDP

    UDP是基于IP的两个主要协议之一,另一个是TCP。基于UDP的应用很多,比如:NFS、SNMP。

    UDP是非连接的,不保证发送报文一定能到达,UDP仅仅是向网络发包,从网络收包,不维护链路状态。

    UDP在IP的基础上添加了两个信息:

    1)  端口号,用以区分不同的应用

    2)  Checksum,用以校验数据正确定

    6.1 端口号

    客户端怎么与服务器上的程序通信?

    应用与UDP通过端口号通信,端口号是从0开始的数字,应用通过监听/响应分配给它的端口号对外提供服务。

    比如,SNMP server监听161端口,如果SNMP client想请求服务,需要向161端口发送请求。

    UDP不会合并拆分UDP包,比如发送5个UDP报文,对端会收到5个。

    6.2 checksum

    当UDP模块收到报文后,UDP模块检查UDP checksum,如果checksum是0,表示发送方没有计算checksum,checksum应该被忽略。如果checksum校验正确,UDP模块根据UDP头中的端口号信息,查看系统中是否有进程监听此端口号,如果有,把报文剥去UDP头,送入应用待读取队列。其它情况,报文将被丢弃,比如checksum错误,没有进程监听此端口号。如果报文流量太大,超过进程读取报文的速度,UDP模块依然会丢包,知道进程待读取队列有空闲空间。

    七 TCP

    相比UDP,TCP提供基于连接的服务,保证报文能到达目的计算机。

    典型的TCP应用包括:FTP、TELNET、X-Window、rcp。

    TCP强大的能力也带来了性能消耗,它需要更多的CPU运算与网络带宽。它比UDP复杂很多。

    TCP客户端从启动开始就与TCP服务程序建立连接,两端各自维护TCP连接的状态信息。TCP连接支持双向通信。

    TCP支持合并提交发送的报文,比如应用发送了5个报文,对端可能只需要读取一次就能全部获取。一端发送的包数量与另一端接收的包数量并没有必然联系。

    TCP是一个滑动窗口协议,支持超时和重传。发出去的数据必须得到确认,否则就要重发。两端均可以实施流控,防止缓冲区溢出。同时TCP协议有自己的窗口大小,窗口大小决定了在确认报文收到前,能够发送的最大报文量,比如在发送端向外发送数据,而对端不回复确认收到,发送端最多只能发送窗口大小的数据量。

    alpha向beta发送IP报文,IP报文的目的IP是beta或223.1.2.2,IP模块在路由表中匹配目的IP的网络号,发现与路由表的第一个条目匹配。路由表的其它信息表示:alpha到beta的逻辑网络通过端口1直接路由。接着通过ARP模块将beta的IP地址转换成MAC地址,然后交由网卡向外发送。如果一个应用向一个不能在路由表中匹配的IP地址发送数据,IP模块将丢弃IP报文,有些计算机可能会回复一个“网络不可达”的错误消息。  

  • 相关阅读:
    进程池Pool
    进程间通信-Queue
    多任务版udp聊天器
    列表循环放引用并写出打印结果
    协程实现tcp两个客户端的通讯
    正则匹配身份证和邮箱
    python中上双互斥锁的线程执行流程
    小巧的http live streaming m3u8播放器
    js实现@提到好友
    mongoose多级嵌套操作
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/13874205.html
Copyright © 2020-2023  润新知