1.TCP/IP协议概述

1.1 TCP/IP分层

通常分不同层次进行开发,每一层负责不同的通信功能。TCP/IP协议族就是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统。如图1.1所示。

TCP/IP协议栈学习总结

图1.1 TCP/IP协议族4个层次

每一层分别负责不同的通信功能:

链路层通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

网络层,主要是做路由的功能,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。主要包括IP协议以及ICMP协议。

传输层主要为两台主机上的应用程序提供端到端的通信,在传输层定义了两种不同的传输协议:传输控制协议TCP(transmission control protocol)和用户数据报协议UDP(user datagram protocol)

应用层主要负责处理特定的应用程序细节。

1.2 封装

在使用 TCP 协议的网络程序中,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息,如图1.2所示经过的逐层封装过程:

TCP/IP协议栈学习总结

图1.2 数据进入协议栈时的封装过程

封装过程从下往上看:

1)链路层通过加固定长度的首部、尾部来封装 IP 数据报(Datagram) 产生以太网帧(Frame)。 其中首部存在对封装数据的标识字段:是 IP协议(0x0800) 、ARP(0x0806) 还是 RARP(0x0835)。

2)网络层通过加 IP首部来封装 TCP 段(Segment) 产生 IP 数据报。 其中首部存在对封装数据的标识:是 ICMP(0x01)、IGMP(0x02)、TCP(0x06)还是 UDP(0x17)。

3)传输层通过加首部来封装应用数据产生 TCP 段。其中TCP首部存在对封装数据的标识:端口号,来标识是那个应用程序产生的数据。比较常见的几个端口号有FTP(21)、Telnet(23)、HTTP(80)。

TCP/IP协议栈学习总结

图1.3以太网数据帧的分用过程

当目的主机收到一份以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部,分用过程如图1.3所示,其中,每层协议盒都要去检查报文首部中的协议标识,以确定接受数据的上层协议。

2. 链路层-以太网协议

以太网的数据封装格式一般如图2.1所示。

TCP/IP协议栈学习总结

图2.1 以太网的封装格式

其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,协议字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。

2.1 最大传输单元MTU

以太网对于数据帧的长度都有一个限制,最大值一般为1500字节,链路层的这个特性叫作MTU,最大传输单元,不同类型的网络大多数都有一个上线。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片,每一片都小于MTU。

2.2 路径MTU

当在同一个网络上的两台主机互相进行通信时,该网络的M T U是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的M T U。重要的不是两台主机所在网络的M T U的值,重要的是两台通信主机路径中的最小M T U。它被称作路径M T U。两台主机之间的路径M T U不一定是个常数。它取决于当时所选择的路由。

3. 网络层-IP、ICMP、ARP

3.1 IP数据报格式

网际协议IP是是网络层中最重要的协议。 IP层接收由链路层发来的数据包,并把该数据包发送到更高层—TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到链路层。

IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。

IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 IP数据报格式如表3.1所示。

表3.1 IP数据报格式及首部中字段

4位版本 4位首部长度 8位服务类型(TOS) 16位总长度
16位标识 3位标志 13位片偏移
8位生存时间(TTL) 8位协议 16位首部检验和
32位源IP地址
32位目的IP地址
32位选项(若有)
数据

IP数据报首部字段含义:

\1. 版本号:即IP协议的版本,占4位。目前协议版本号为4。

\2. 首部长度:这里是指首部占32bit字的数目,其占4位,因而,首部字节最长为60个字节。

\3. 服务类型字段(TOS):其包括3bit已被忽略的优先权子字段,4bit的TOS子字段,以及1bit未用位(置0)。TOS分别代表:最小时延,最大吞吐量,最高可靠性,最小费用,且最多只能一位置1.

\4. 总长度字段:指整个IP数据报的长度,以字节为单位。因而IP数据报最长可达65535字节。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。

\5. 标识字段:唯一的标识主机发送的每一份数据报。通常每发送一份报文,其值加1。

\6. 标志字段:分为3位,依次为保留位、不分片位(DF)和更多片位(MF)。

保留位:一般被置为0;

不分片位:表示该数据报是否被分片,如果被置为1,则不能对数据报进行分片,如果要对其进行分片处理,就应将其置为0。

更多片位:除了最后一个分片,其他每个组成数据报的片都要讲该位置为1。

\7. 片偏移:该分片相对于原始数据报开始处位置的偏移量。(除去IP首部)

\8. 生存时间TTL:设置数据报可以经过的最多路由器数,它指定了数据报的生存时间。生存时间由源主机指定,在数据报传输过程中,每经过一个路由器,该值就减1,当该字段的值为0时,数据报就会被丢弃,并发送ICMP报文通知源主机。

\9. 协议字段:向IP层传输数据的协议类型,常见协议类型包括ICMP、IGMP、TCP以及UDP等。

\10. 首部校验和:校验接收到的IP数据报是否有差错。其计算方法为每16bit字二进制反码求和。接收端的检验和应该是全1,否则就是传输过程有差错产生。

\11. 源IP地址:源主机的IP地址。

\12. 目的IP地址:目的主机的IP地址。

\13. 选项:该字段是数据报中的可选字段。

3.2 IP路由选择

如果目的主机与源主机直接相连或都在一个共享网络上,那就直接把包发送到目的主机,如果不是,那把IP数据报送到默认路由器,由它转发路由器使用路由表保存自己知道的网络的信息。

路由表中主要包括以下信息:

1、目的IP地址,它可以是一个完整的主机地址或是一个网络地址,主机地址主机号非0,网络地址主机号为0;

2、下一个路由器地址,这个路由器是与当前路由器直接相连的路由器,或是直接相连的网络IP地址;

3、标志,其中一个表明目的IP地址是网络地址还是主机地址,另一个指明下一站是真正的路由器还是网络接为数据报的传输指定一个网络接口。

每个路由器都不需要知道所有网络的信息,当它发现要转发的包不在与自己直接连接的网络时,就会把这个包发给下一个路由器,一直到终点IP。

路由选择主要完成以下功能:

1、搜索路由表,寻找能与目的地址完全匹配的条目,如果找到直接发给它;

2、搜索路由表,寻找能与目的网络号完全匹配的条目,如果找到将包发给这一条目指定的下一个路由器或是网络接口;

3、搜索路由表,寻找默认条目,如果找到把这个报文发给它如果都不成功,将不再发送这个包,向源地址发送一个ICMP不可达报文使用网络号而不是具体主机可以减少路由表的大小。

3.3 ARP地址解析协议

当一台主机把以太网数帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。

地址解析为这两种不同的地址形式提供映射:32bit的IP地址和数据链路层使用的任何类型的地址。ARP为IP地址到对应的硬件地址之间提供动态映射。

TCP/IP协议栈学习总结

图3.1 ARP请求或应答分组格式

ARP的报文格式如图3.1所示,以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。

两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。

形容词hardware(硬件)和protocol(协议)用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)。

硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧的类型字段值相同,这是有意设计的。

接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求和应答来说,它们的值分别为6和4。

操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。

接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。

对于一个ARP请求来说,除目的端硬件地址外的所有其他字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去,在发送请求报文时,以太网首部中以太网目的地址填写广播地址。

TCP/IP协议栈学习总结

图3.2 用户输入命令“ftp主机名”时ARP的操作

ARP操作如图3.2所示。具体工作流程如下:

1)应用程序打开FTP客户端。

2)FTP客户端请求TCP用得到的IP地址建立链接。

3)TCP发送一个连接请求分段到远端的主机,即用上述IP地址发送一份IP数据报。

4)如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那么IP数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,那么就通过IP选路函数来确定位于本地网络上的下一站路由器地址,并让它转发IP数据报。在这两种情况下,IP数据报都是被送到位于本地网络上的一台主机或路由器。

5)假定是一个以太网,那么发送端主机必须把32bit的IP地址变换成48bit的以太网地址。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的功能。ARP本来是用于广播网络的,有许多主机或路由器连在同一个网络上。

6)ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,如上图的虚线所示。ARP请求数据帧中包含目的主机的IP地址(主机名为bsdi),其意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址。”

7)目的主机的ARP层收到这份广播报文后,识别出这是发送端在寻问它的IP地址,于是发送一个ARP应答。这个ARP应答包含IP地址及对应的硬件地址。

8)收到ARP应答后,使ARP进行请求一应答交换的IP数据报现在就可以传送了。

9)发送IP数据报到目的主机。

3.4 ICMP互联网控制报文协议

ICMP 经常被认为是 IP 层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP 报文通常被 IP 层或更高层协议(TCP 或 UDP)使用。ICMP 报文是在 IP 数据报内部传输的。IP 协议是不可靠协议,不能保证 IP 数据报能够成功的到达目的主机,无法进行差错控制,而 ICMP 协议能够协助 IP 协议完成这些功能。

ICMP报文个字段的含义:

类型:一个 8 位类型字段,表示 ICMP 数据包类型;

代码:一个 8 位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为 0;

检验和:数据包中 ICMP 部分上的一个 16 位检验和;

TCP/IP协议栈学习总结

图3.3 ICMP报文格式

ICMP 报文大致可分为两类:差错报文、查询报文。以下针对 ICMP 差错报文的类型进行分析:

1、ICMP 目标不可达消息:IP 路由器无法将 IP 数据报发送给目的地址时,会给发送端主机返回一个目标不可达 ICMP 消息,并在这个消息中显示不可达的具体原因。

2、ICMP 重定向消息:如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个 ICMP 重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个 ICMP 重定向消息给发送端主机一个更合适的发送路由。

3、ICMP 超时消息:IP 数据包中有一个字段 TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减 1,直到减到 0 时该IP 数据包被丢弃。此时,IP 路由器将发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。

4、源抑制消息:当 TCP/IP 主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个 ICMP 源抑制消息。

Ping 程序

Ping 程序利用 ICMP 回显请求报文和回显应答报文(而不用经过传输层)来测试目标主机是否可达。它是一个检查系统连接性的基本诊断工具。

ICMP 回显请求和 ICMP 回显应答报文是配合工作的。当源主机向目标主机发送了 ICMP 回显请求数据包后,它期待着目标主机的回答。目标主机在收到一个 ICMP 回显请求数据包后,它会交换源、目的主机的地址,然后将收到的 ICMP 回显请求数据包中的数据部分原封不动地封装在自己的 ICMP 回显应答数据包中,然后发回给发送 ICMP 回显请求的一方。如果校验正确,发送者便认为目标主机的回显服务正常,也即物理连接畅通。

Traceroute 程序

Traceroute 程序主要用来侦测源主机到目的主机之间所经过的路由的情况。

Traceroute 使用 ICMP 报文和 IP 首部中的 TTL 字段,它充分利用了 ICMP 超时消息。其原理很简单,开始时发送一个 TTL 字段为 1 的 UDP 数据报,而后每次收到 ICMP 超时萧后,按顺序再发送一个 TTL 字段加 1 的 UDP 数据报,以确定路径中的每个路由器,而每个路由器在丢弃 UDP 数据报时都会返回一个 ICMP 超时报文,而最终到达目的主机后,由于 ICM P选择了一个不可能的值作为 UDP 端口(大于30000)。这样目的主机就会发送一个端口不可达的 ICMP 差错报文。

4 .传输层-UDP 用户数据报协议

4.1 UDP 协议概述

UDP协议主要有以下几个特点:

· UDP是一种无连接的, 即发送数据前不需要建立连接,因此减小的开销和发送数据的延迟。

· UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。

· UDP是面向报文的。

· UDP没有拥塞控制,因此网络出现的拥塞不会使主机的发送率降低。

· UDP支持一对一,一对多,多对一和多对多的交互通信。

· UDP首部开销小,只有8字节,比TCP的20个字节的首部要短。

· UDP封装格式如图4.1:

TCP/IP协议栈学习总结

图4.1 UDP封装格式

UDP报文格式如图4.2所示。

· 源端口号:该项是任选项,默认值是0,可以被指定。

· 目的端口号:该项必须指定,因为这个作为接收主机内特定应用进程相关联的地址。

· UDP长度:该字段表示数据报文的长度(包含首部和数据部分),最小8个字节。

· 检验和:该字段用于防止UDP用户数据报在传输中出错。当进行检验和计算时,要在UDP数据报之前增加临时的12个字节伪首部。

TCP/IP协议栈学习总结

图4.2 UDP首部格式

UDP检验和是可选的,而TCP检验和是必须的,UDP和TCP数据报在检验时都包含一个12字节长的伪首部,其目的是检查UDP是否到达正确目的地址。另一个与IP不同的是UDP长度可为奇数字节,但是检验和算法是若干16bit字相加,因而数据部分不足的要补0。

4.2 IP分片

物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。 其发生与控制由IP数据报文中标志位和片偏移来决定。

5 .应用层-DNS域名系统

5.1 DNS首部格式

DNS只有两种报文:查询报文、回答报文,两者有着相同格式,如图5.1所示。

TCP/IP协议栈学习总结

图5.1 DNS报文格式

标识位:对该查询进行标识,该标识会被复制到对应的回答报文中,客户机用它来匹配发送的请求与接收到的回答。

标志位:包括若干个子字段,如图5.2。

TCP/IP协议栈学习总结

图5.2 标志字段

QR(1比特):查询/响应的标志位,1为响应,0为查询。

opcode(4比特):定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求)。

AA(1比特):授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权限服务器(关于权限服务器以后再讨论)

TC(1比特):截断标志位。1表示响应已超过512字节并已被截断(依稀好像记得哪里提过这个截断和UDP有关,先记着)

RD(1比特):该位为1表示客户端希望得到递归回答(递归以后再讨论)

RA(1比特):只能在响应报文中置为1,表示可以得到递归响应。

zero(3比特):不说也知道都是0了,保留字段。

rcode(4比特):返回码,表示响应的差错状态,通常为0和3。

5.2 查询报文与响应报文

DNS查询报文中的每个问题的格式如图5.3所示,通常只有一个问题。

TCP/IP协议栈学习总结

图5.3 问题部分的格式

查询名部分长度不定,一般为要查询的域名(也会有IP的时候,即反向查询)。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。

通常查询类型为A(由名字获得IP地址)或者PTR(获得IP地址对应的域名),查询类通常为1,指Internet地址。

DNS响应报文最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR的相同格式。图5.4显示了资源记录的格式。

TCP/IP协议栈学习总结

图5.4 DNS资源记录格式

生存时间字段,用于指示该记录的稳定程度,极为稳定的信息会被分配一个很大的值(如86400,一天的秒数)。该字段表示资源记录的生命周期(以秒为单位),一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。

资源数据长度(2字节) 表示资源数据的长度(以字节为单位,如果资源数据为IP则为0004)。

资源数据字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。

相关文章: