Skip to main content
 首页 » DevOps

TCP/IP入门指导

2022年07月19日139三少

本文翻译自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报文,有些计算机可能会回复一个“网络不可达”的错误消息。  


本文参考链接:https://www.cnblogs.com/hellokitty2/p/13874205.html