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

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

引用