rfc1180(TCP/IP 概览)阅读笔记

2017/12/18

介绍了一个网络流量是怎么从起点达到终点的,涉及到 Ethernet/ARP/TCP/IP/UDP。注意本文的目的是解释而不是定义。

概览

TCP/IP这个一般指任何和TCPIP有关的概念,比如协议(UDP, ARP, ICMP),应用(TELNET, FTP, rcp)。

术语

数据流在不同的协议阶段有不同的名称(和结构),在Ethernet里面叫做Ethernet frame;Ethernet driver 和 the IP module 之间就是IP packet;在 IP module 和 the UDP module 之间叫做UDP datagram;在 IP module 和 the TCP module 之间叫做TCP segment (more generally, a transport message);在 a network application 中叫做application message

更具体的定义参见RFC 1122, section 1.3.3

A driver is software that communicates directly with the network interface hardware.

A module is software that communicates with a driver, with network applications, or with another module.

The terms driver, module, Ethernet frame, IP packet, UDP datagram, TCP message, and application message在本文中将一直出现

数据流

按照图 1 的数据流动方向来看看数据是怎么传播的。

对于一个使用TCP (Transmission Control Protocol)的 application 来说,数据传递到了TCP module。对于一个使用UDP (User Datagram Protocol)的 application 来说,数据传递到了UDP moduleFTP (File Transfer Protocol) 是一个经典的使用 TCP 的 application,他的协议栈是FTP/TCP/IP/ENETSNMP (Simple Network Management Protocol) 是一个使用了UDP的 application,它的协议栈是 SNMP/UDP/IP/ENET。

TCP module, UDP module, 和Ethernet driver 都是 n-to-1 multiplexers. 什么是 multiplexers 呢:多输入,一个输出。他们也是 1-to-n de-multiplexers. 什么是 de-multiplexers 呢:一个输入,多个输出(通过协议头的 type field 来控制)

也就说说,一个数据从 Ethernet 而来,可能被送往 ARP,也有可能是 IP。反过来就简单了,一个数据从 TCP 而来,那么就沿着往外传输就好了。

Ethernet 是本文使用的 IP 之下的协议(还有很多其他的协议),Ethernet 地址 6 字节,IP 地址 4 字节(全网唯一)。

每一个计算机都会知道自己的 IP 地址和 Ethernet 地址。

两个网络的模型

在这个模型里面,IP module 是一个 n-to-m multiplexer 和一个 m-to-n de-multiplexer。

数据可以任意而来,也往任意而去。

一个 IP packet 转发可能不会涉及到TCP/UDP

对于数据经过的每个协议,协议都会加上它自己的头信息,相反的,也会解析去掉它所对应的头信息

问几个问题

1、发送 IP 包的时候,怎么知道目标的 Ethernet 地址的 2、IP 怎么知道使用哪些底层协议去传输协议 3、一台计算机的数据怎么到达另外一个计算机 4、为什么 TCP、UDP 同时存在,去掉一个行不行 5、什么 network applications 可获取 这几个问题将在下一节 Ethernet 之后得到解答。

Ethernet

一个Ethernet frame 包含 destination address(目标地址), source address(来源地址), type field(类型头部), 和 data(数据)。

Ethernet 地址长度 6 字节。每一个 Ethernet 设备都会有自己的地址,并且以那个地址作为destination address监听(就是数据发往这个地址的)。所有的设备都监听了这个destination address:”FF-FF-FF-FF-FF-FF” (16 进制),广播地址。

Ethernet 使用 CSMA/CD (Carrier Sense and Multiple Access with Collision Detection).什么是 CSMA/CD 呢:所有的设备(每个设备都有唯一的 Ethernet 地址)在同一时间只能有一个说话(信息包括他是谁,他要和谁说话,内容),他们同时进行监听。如果有两个设备在同一时间发声了,那么这两个设备就等待随机的一小段时间,才能说话。

ARP

ARP (Address Resolution Protocol) 是用来将 IP 地址转为 Ethernet 地址的,这个过程在 IP 包发出的时候就做完了,因为 IP 包的头部和 Ethernet 的头部需要这个信息。

ARP table是一个保存在内存里面的表,包含 IP 地址和 Ethernet 地址。4 字节的 IP 地址用十进制数表示,每个数用.连接;6 字节的 Ethernet 地址用 16 进制表示,每个数字用-连接:

这两个地址完全没啥关系,不能通过算法计算出来。IP 地址由网管分配,Ethernet 地址由设备制造商确定。

如果一个地址找不到了,这个时候会: 1、向所有的设备广播一条消息,询问地址 2、把这个无法转换的 IP 包假如队列,稍后处理 3、然后监听这广播地址的所有设备收到消息之后,看看自己是不是 target 地址,是的话就把 Ethernet 地址补充了返回回去。 4、这个时候转换出 Ethernet 地址,发出 IP 包

Internet Protocol

IP协议是互联网技术的中心,而 IP 协议的重点就是它的路由表。

直接路由

下面的图是一个只有三台计算机:ABC 的小型互联网。

如果一个 IP 包从 A 发往 B,那么它的头部中会包含这 4 个信息:

B 收到这个 IP 包的时候,就会看目标地址是不是自己,如果是的话,就会传输给上层协议。

间接路由

D 是IP-router,它连接到三个网络。每个网络之间,以及 D 和他们各自之间都是直接路由。跨网络就是间接路由了。

如果 A 要发 IP 包到 E,那么源 IP 地址和源 Ethernt 地址都是 A 的,目标 IP 地址是 E 的,三十目标 Ethernet 地址是 D 的。

然后 D 收到这个包的时候,发现目标 IP 地址不是自己的,就不会接受,并转发给 E,其中数据如下:

IP 模块路由规则

IP 地址

本文中举例的都是C 类 IP 地址:前 3 个 bit 是110(所以第一个字节的范围是1100 00001101 1111,也就是 192 到 223),加 21bit 的network number,加 8bit 的host number(也就是说最后 1 个字节是机器号,前 3 个字节是网络号,如果前 3 个 bit 是 110 的话)。

IP 地址由NIC (Network Information Center)分配

名字

例如

IP 路由表

IP 协议怎么知道用什么底层协议来发送数据包呢?使用 IP 路由表。

这个路由表包括:IP network number(网络号),direct/indirect flagrouter IP address, and interface number

直接路由详情

看一个具体的例子

路由表

不带名字的路由表

直接的例子

alpha 发动一个 IP 包给 beta。目标地址是 beta 的 IP 地址(223.1.2.2),IP 协议取出网络号(223.1.2),然后在路由表中第一项搜索。通过路由表可以知道,通过 1 号接口(interface number 1)可以直接(directly)送达。然后 ARP 转换完成,并且这个 Ethernet 包通过接口 1 倍发往 beta。

如果尝试发往不在这个网络的机器,那么在路由表中就找不到,IP 就会放弃这个包。

间接路由详情

网络:

路由表:

把 name 换成network number的路由表:

简介路由例子

Alpha 给 epsilon 发了一个 IP 包,目标 IP 地址是 epsilon (223.1.3.2),取出 network number 是:223.1.3,然后在路由表第一列里搜索,匹配到第二行。

匹配到的结果是非直连的,所以 Alpha 的 IP 模块通过 ARP 转换吧 IP 包的目标 Ethernet 地址填上了 IP 路由 devnetrouter 的地址,但是目标 IP 仍然是 epsilon (223.1.3.2)。

到达 IP 路由 delta 之后,因为目标 IP 地址不是 delta 的,所以 delta 就会转发这个请求:取出 network number,然后搜索 delta 的 IP 路由表,结果是可以通过接口 3 直连。

下图是的 IP 路由表:

现在 IP 报的目标 IP 地址和目标 Ethernet 地址都是 epsilon 的了。

当 IP 包达到 epsilon 的时候,被送往 epsilon 的 IP 模块,目标 IP 地址匹配,所以这个 IP 包被传递给上层协议层。

匹配路由总结

当 IP 数据包通过大型互联网传输时,它可能会在到达目的地之前经过许多 IP 路由器。 它所采取的路径并不是由一个中心来源决定的,而是参考旅程中使用的每个路由表的结果。 每台计算机只定义旅程中的下一个跃点,并依靠该计算机发送 IP 数据包。

管理路由表

在大型互联网上的所有计算机上维护正确的路由表是一项艰巨的任务;网络管理员不断修改网络配置,以满足不断变化的需求。路由表中的错误会以难以诊断的方式阻塞通信。

保持简单的网络配置对于建立可靠的互联网有很大的帮助。例如,将 IP 网络分配给以太网最直接的方法是为每个以太网分配一个 IP 网络号码。

某些协议和网络应用程序也提供帮助。 ICMP (Internet Control Message Protocol)可以报告一些路由问题。对于小型网络,路由表由网络管理员在每台计算机上手动填写。对于较大的网络,网络管理员使用路由协议自动执行此手动操作,以在整个网络中分发路由。

当一台计算机从一个 IP 网络移到另一个时,其 IP 地址必须改变。从 IP 网络中删除计算机时,其旧地址将变为无效。这些更改需要频繁更新“主机”文件。即使是中等规模的网络,这个平面文件也很难维护。DNS(Domain Name System)有助于解决这些问题。

UDP(User Datagram Protocol)

UDP是 IP 协议之上的两个协议之一。引用有: Network File System (NFS) 和 Simple Network Management Protocol (SNMP)。

UDP是无连接的数据报传送服务,不保证传送。 UDP 不保持与远程 UDP 模块的端到端连接; 它只是将数据报推送到网络上,并接收来自网络的传入数据报。

UDP为 IP 提供了两个值:PortsChecksum

Ports

一个计算机上的 client 如何在另一台计算机上访问 server?

应用程序和 UDP 之间的通信路径是通过 UDP 端口。这些端口被编号,从零开始。提供服务的应用程序(服务器)等待消息进入专用于该服务的特定端口。服务器耐心等待任何客户请求服务。

例如,称为 SNMP 代理的 SNMP 服务器始终在端口 161 上等待。每台计算机只能有一个 SNMP 代理,因为只有一个 UDP 端口号 161。这是一个固定的号码,互联网分配的号码。如果 SNMP 客户端需要服务,则将其请求发送到目标计算机上的 UDP 端口号 161。

当应用程序通过 UDP 发送数据时,它作为一个单元到达远端。例如,如果应用程序向 UDP 端口写入数据,则远端应用程序将从 UDP 端口读取 5 次数据。而且,每个写入的大小与每个读取的大小相匹配。

UDP 保留由应用程序定义的消息边界。它不会将两个应用程序消息连接在一起,也不会将单个应用程序消息分成几个部分。

Checksum

具有指示“UDP”的 IP 报头类型字段的输入 IP 包通过 IP 被传递给 UDP 模块。当 UDP 模块接收到来自 IP 的 UDP 数据报时,将检查 UDP 校验和。如果校验和为零,则表示校验和不是由发送方计算的,可以忽略。因此,发送计算机的 UDP 模块可能会或可能不会生成校验和。如果以太网是通信的两个 UDP 模块之间的唯一网络,那么您可能不需要校验和。但是,建议始终启用校验和生成,因为在将来的某个时刻,路由表更改可能会将数据发送到不太可靠的介质上。

如果校验和是有效的(或为零),则检查目标端口号,如果应用程序绑定到该端口,应用程序消息就排队等候应用程序读取。否则,丢弃 UDP 数据报。如果传入的 UDP 数据报到达的速度比应用程序能够读取的速度快,并且队列填充到最大值,则 UDP 数据报将被 UDP 丢弃。 UDP 将继续丢弃 UDP 数据报,直到队列中有空间。

TCP(Transmission Control Protocol)

TCP 提供与 UDP 不同的服务。 TCP 提供了一个面向连接(connection)的字节流,而不是无连接的数据报传送服务。 TCP 保证传送,而 UDP 不传送。

TCP 被需要保证传送的网络应用所使用,并且不会因为执行超时和重传而烦恼。使用 TCP 的两个最典型的网络应用程序是文件传输协议(FTP)和 TELNET。其他流行的 TCP 网络应用程序包括 X-Window 系统,rcp(远程复制)和 rseries 命令。 TCP 的更大能力不是没有代价的:它需要更多的 CPU 和网络带宽。 TCP 模块的内部比 UDP 模块的内部复杂得多。

与 UDP 类似,网络应用程序连接到 TCP 端口。明确的端口号专用于特定的应用程序。例如,TELNET 服务器使用端口号 23. TELNET 客户端只需连接指定计算机上的 TCP 端口 23 即可找到服务器。

当应用程序首次使用 TCP 时,客户端计算机上的 TCP 模块和服务器计算机上的 TCP 模块开始相互通信。这两个端点 TCP 模块包含定义虚拟电路的状态信息。这个虚拟电路消耗了两个 TCP 端点的资源。虚拟电路是全双工的;数据可以同时在两个方向上进行。应用程序将数据写入 TCP 端口,数据遍历网络,并由远端的应用程序读取。

TCP 随意打包字节流;它不保留写入之间的界限。例如,如果应用程序向 TCP 端口写入数据,则远端的应用程序可能会执行 10 次读取以获取所有数据。或者它可能通过一次读取获得所有的数据。一端的写入次数和大小与另一端的读取次数和大小之间没有关系。

TCP 是具有超时和重发的滑动窗口协议。传出数据必须由远端 TCP 确认。确认可以背上数据。两个接收端都可以控制远端,从而防止缓冲区溢出。

与所有滑动窗口协议一样,协议具有窗口大小。窗口大小决定了在需要确认之前可以传输的数据量。对于 TCP,这个数量不是一个 TCP 段数,而是一些字节数。

Network Applications

为什么 TCP 和 UDP 都存在,而不是一个或另一个?

他们提供不同的服务。大多数应用程序被实现为仅使用一个或另一个。你,程序员,选择最能满足你需求的协议。如果您需要可靠的流传输服务,TCP 可能是最好的。如果你需要数据报服务,UDP 可能是最好的。如果您需要长途电路的效率,TCP 可能是最好的。如果您需要快速网络的效率,那么 UDP 可能是最好的。如果您的需求不能很好地落入这些类别,那么“最佳”的选择是不清楚的。但是,应用程序可以弥补选择上的不足。例如,如果您选择 UDP 并且您需要可靠性,那么应用程序必须提供可靠性。如果您选择 TCP 并且您需要面向记录的服务,那么应用程序必须在字节流中插入标记以划分记录。

什么网络应用程序可用?

有太多可以列出。这个数字正在不断增长。一些应用程序从互联网技术开始就已经存在:TELNET 和 FTP。还有一些是比较新的:X-Windows 和 SNMP。以下是本教程中提到的应用程序的简要说明。

TELNET

TELNET 提供 TCP 上的远程登录功能。 操作和外观类似于通过电话交换机的键盘拨号。 在命令行中,用户键入“telnet delta”,并从计算机接收名为“delta”的登录提示。

TELNET 运行良好; 这是一个旧的应用程序,具有广泛的互操作性。 TELNET 的实现通常在不同的操作系统之间工作。 例如,TELNET 客户端可能位于 VAX / VMS 上,UNIX 系统 V 上的服务器上。

FTP

文件传输协议(FTP),和 TELNET 一样老,也使用 TCP,具有广泛的互操作性。 操作和外观仿佛你 TELNET 到远程计算机。 但是,不要输入你惯常的命令,你必须做一个简短的目录列表等命令。 FTP 命令允许您在计算机之间复制文件。

rsh

远程 shell(rsh 或 remsh)是远程 UNIX 样式命令的完整系列之一。 UNIX 复制命令 cp 变为 rcp。 UNIX“谁登录”命令,谁成为 rwho。 该列表继续并被统称为“r”系列命令或r *(r 之星)命令。

r *命令主要在 UNIX 系统之间工作,并被设计用于可信主机之间的交互。 很少考虑安全性,但它们提供了一个方便的用户环境。

要在名为 delta 的远程计算机上执行“cc file.c”命令,请键入“rsh delta cc file.c”。 要将“file.c”文件复制到增量,请键入“rcp file.c delta:”。 要登录到增量,请键入“rlogin delta”,如果您以某种方式管理计算机,则不会受到密码提示的挑战。

NFS

网络文件系统,由 Sun Microsystems 公司首先开发,使用 UDP,非常适合在多台计算机上安装 UNIX 文件系统。 无盘工作站可以访问其服务器的硬盘,就好像该工作站的本地磁盘一样。 如果数据库的文件系统是 NFS 安装在“测试版”上,主机“beta”上的主机“alpha”上的数据库的单个磁盘副本也可以使用。

NFS 给网络增加了很大的负载,并且在慢速链路上的效用很差,但是好处很大。 NFS 客户端在内核中实现,允许所有应用程序和命令像使用本地磁盘一样使用 NFS 安装的磁盘。

SNMP

简单网络管理协议(SNMP)使用 UDP,专为中央网络管理站使用而设计。 众所周知,如果提供足够的数据,网络管理员可以检测和诊断网络问题。 中心站使用 SNMP 从网络上的其他计算机收集这些数据。 SNMP 定义数据的格式; 留给中心站或网络管理员来解释数据。

X-Window

X Window 系统使用 TCP 上的 X Window 协议在工作站的位图显示上绘制窗口。 X Window 不仅仅是一个绘制窗口的工具, 这是设计用户界面的全部理念。

Other Information

关于互联网技术的许多信息不包含在本教程中。 本部分列出了希望了解更多内容的读者的下一级信息。

引用