本文翻译自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