TCP/IP详解-协议

Posted zhangqixiang5449

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP详解-协议相关的知识,希望对你有一定的参考价值。

本书17-23章讲解TCP,为重点。标题用红色字体标明

1.概述

TCP/IP通常被认为是一个四层协议系统,包括:

1.链路层,用于处理物理接口。
2.网络层,处理分组在网络中的活动,如分组的选路。在TCP/IP协议族中,网络层协议包括IP,ICMP(Internet控制报文协议),IGMP(Internet组管理协议)。并不提供可靠性保证。
3.运输层,用于提供两台主机上端到端的通信。在TCP/IP协议族中,包括TCP和UDP,TCP为两台主机提供可靠的数据通讯。UDP并不保证数据报能到达另一端。
4.应用层,处理应用程序细节。应用层不关心数据在网络中的传输活动。

连接网络的途径:

1.网桥,在链路层上对网络进行互联。
2.路由器,在网络层上对网络进行互联。TCP/IP倾向于使用路由器。

TCP/IP的分层

互联网的地址

客户-服务器模型

重复型:重复型通过以下步骤进行交互
I1.等待一个客户请求的到来。
I2.处理客户请求。在该状态下不能为其他客户机提供服务。
I3.发送响应给发送请求的客户。
I4.返回I1。

并发型:并发型通过以下步骤进行交互
C1.等待一个客户请求的到来。
C2.启动一个新的服务器来处理。处理结束后终止这个服务器。可为多个客户服务。
C3.返回C1。

一般来说,TCP服务器是并发的,而UDP服务器是重复的,但也存在一些例外。


2.链路层

链路层主要有三个目的:
1.为IP模块发送和接收IP数据报。
2.为ARP模块发送ARP请求和接收ARP应答。
3.为RARP发送RARP请求和接收RARP应答。

SLIP:串行线路IP

SLIP(Serial Line IP)是一种在串行线路上对IP数据报进行封装的简单形式。

SLIP定义的帧格式:

1.IP数据报以称作END(0xc0)的特殊字符结束。为防止数据报到来前的噪声被当做数据报,大多数数据报的开始处也传一个END字符。
2.如IP数据报中某个字符为END(0xc0),那么为避免误读将会以0xdb和0xdc两个字节取代0xc0。0xdb这个特殊字符被称作SLIP的ESC字符。
3.若IP数据报中某个字符为SLIP的ESC字符(0xdb),就用0xdb和0xdd取代他。

SLIP的缺陷:

1.每一端必须知道对方的IP地址。没有办法把本端的IP地址通知给另一端。
2.数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于SLIP, 那么它不能同时使用其他协议。
3.SLIP没有在数据帧中加上检验和(类似于以太网中的 CRC字段)。如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现(另一种方法是,新型的调制解调器可以检测并纠正错误报文)。这样,上层协议提供某种形式的CRC就显得很重要。

PPP:点对点协议

PPP点对点协议修改了SLIP协议中的所有缺陷。

PPP包括以下三个部分:

1.在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶检验的异步模式 (如大多数计算机上都普遍存在的串行接口),还支持面向比特的同步链接。
2.建立,配置及测试数据链路的链路控制协议(LCP:Link Control Protocol)。它允许通 信双方进行协商,以确定不同的选项。
3.针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系。

PPP定义的帧格式:

1.每一帧都以标志字符0x7e开始和结束。紧接着是一个地址字节,值始终是0xff,然后是一 个值为0x03的控制字节。
2.接下来是协议字段,类似于以太网中类型字段的功能。不同值代表信息字段为不同的东西,详情看下图。
3.信息字段。类型由协议字段表示。
4.CRC字段。用于检测数据帧中的错误。

由于标志字符的值是0x7e,因此当该字符出现在信息字段中时, P P P需要对它进行转义。转移方法看书19页。

PPP对比SLIP的优点

1.PPP支持在单根串行线路上运行多种协议, 不只是IP协议。
2.每一帧都有循环冗余检验。
3.通信双方可以进行IP地址的动态协商(使用IP网络控制协议)
4.与CSLIP类似,对TCP和I P报文首部进行压缩.
5.链路控制协议可以 对多个数据链路选项进行设置。为这些优点付出的代价是在每一帧的首部增加 3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。

环回接口

环回接口允许运行在同一主机上的服务器与客户通过TCP/IP通信。ip地址为127.0.0.1命名为localhost。


3.IP网际协议

IP协议的特性

1.不可靠,不保证IP数据报能达到目的地,如果发生某种错误,IP协议将丢弃该数据报。
2.无连接,各个数据报相互独立,不保证接收顺序,或使用相同线路。

IP首部


1.版本:IP协议的版本号,目前是4,也称IPv4
2.首部长度。指IP数据报首部的长度为多少个32bit。由于其占4bit,所以IP数据报首部最长60字节( (2^5 - 1) * 32 / 8 = 60)。
3.服务类型(TOS):包括一个3bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1bit未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。
4.总长度:以字节表示的IP数据报总长度。由于字段长16bit,所以IP数据报长度最多为65535字节((2^17 - 1)).
5.标识:标识数据报的ID,通常发送一份报文就会+1,溢出清0。
6.标志和片偏移:在11章讨论。
7.TTL生存时间:数据报可经过的最多路由器数。
8.协议:识别哪个协议向IP传送数据。
9.首部检验和:对IP数据报的首部(不算数据)进行检验。首先把检验和字段置为0。然后,对首部中每个16bit 进行二进制反码求和(整个首部看成是由一串 16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个 16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错, 那么接收方计算的结果应该为全 1。如果结果不是全1(即检验和错误),那么I P就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
10.源地址和目的地址如字面意思。

IP路由选择

如果目的主机与源主机直接相 连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。

路由表中包含:

1.目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定(如下所述)。主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机(如以太网,令牌环网)。
2.下一跳路由器IP地址。
3.标志,其中一个标志指明目的 I P地址是网络地址还是主机地址,另一个标志指明下一 站路由器是否为真正的下一站路由器,还是一个直接相连的接口
4.为数据报的传输指定一个网络接口。

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

1.搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标 志字段的值)。
2.搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。 这种搜索网络的匹配方法必须考虑可能的子网掩码。
3.搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。 完整主机地址匹配在网络号匹配之前执行。只有当它们都失败后才选择默认路由。
为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模。


4.ARP:地址解析协议

ARP为IP地址到对应的硬件地址之间提供动态映射,解决同一局域网上的主机或路由器的IP地址和硬件地址的映射问题。ARP在高速缓存中存放一个从IP地址到硬件地址的映射表,并经常动态更新。

ARP工作方式

ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,ARP请求数据帧中包含目的主机的IP地址,其意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址。”
目的主机的ARP层收到这份广播报文后,识别出这是发送端在寻问它的IP地址,于是发送一个ARP应答。这个ARP应答包含IP地址及对应的硬件地址。
发送方收到ARP响应分组后在ARP高速缓存中写入响应分组包含的IP地址和硬件地址。

ARP的分组格式


协议内容说明查看40页

对不存在主机的ARP请求

指定一个不存在的主机号,但其网络号和子网号对应的网络存在。ARP将会多次发送请求,大约75秒后放弃。

ARP高速缓存超时设置

ARP高速缓存中的表项一般都要设置超时值。一般对万丈的表项设置超时值为20分钟,对不完整的表项为3分钟。当这些表项再次使用时,将超时值重设为20分钟。

ARP代理

如果ARP请求是从一个网络的主机发往另一个网络上的主机 , 那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理 ( ProxyARP) 。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另 一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。
ARP代理也称作混合ARP (promiscuous ARP)或 ARP出租 (ARP hack) 。这些名字来自于ARP代理的其他用途:通过两个物理网络之间的路由器可以互相隐藏物理网络。在这种情况下,两个物理网络可以使用相同的网络号,只要把中间的路由器设置成一个ARP代理 , 以响应一个网络到另一个网络主机的ARP请 求 。这种技术在过去用来隐藏一组在不同物理电缆上运行旧版TCP/IP的主机。分开这些旧主机有两个共同的理由,其一是它们不能处理子网划分,其二是它们使用旧的广播地址。

免费ARP

指主机发送ARP查找自己的IP地址 。通常,它发生在系统引导期间进行接口配置的时候 。

免费ARP可以有两个方面的作用 :
1.一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。
2.如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了, 并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。


5.RAPR:逆地址解析协议

RAPR用于以硬件地址请求IP地址。

RARP的分组格式

RARP分组的格式与ARP分组基本一致。它们之间主要的差别是RARP请求或应答的帧类型代码为0x8035,而且RARP请求的操作代码为3,应答操作代码为4。
对应于ARP,RARP请求以广播方式传送,而RARP应答一般是单播(unicast)传送的。


6.ICMP:Internet控制报文协议

ICMP报文是在IP数据报内部被传输的,通常被IP或更高层使用。

ICMP报文格式


1.类型前4bit相同,剩下4位有15种不同的值。
2.代码,用于进一步描述
3.检验和,用于检验首部正确性。

ICMP报文的类型


当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来 。

下面各种情况都不会导致产生ICMP差错报文:
1.ICMP差错报文(可能导致无限差错,但是ICMP查询报文可能会产生ICMP差错报文)。
2.目的地址是广播地址或多播地址的IP数据报。
3.作为链路层广播的数据报。
4.不是IP分片的第一片(将在11.5节介绍分片)。
5.源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴 。

ICMP查询报文

ICMP地址掩码请求与应答


ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文。ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样发送端就可以把应答与请求进行匹配。

ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回自午夜2启经过的毫秒数。

请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写传送时间戳。

ICMP路由器发现报文


路由器在一份报文中可以通告多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址32bit字的数目,始终为2。生存期指的是通告地址有效的时间(秒数)。接下来是一对或多对IP地址和优先级。IP地址必须是发送路由器的某个地址。优先级是一个有符号的32bit整数,指出该IP地址作为默认路由器地址的优先等级,这是与子网上的其他路由器相比较而言的。值越大说明优先级越高。优先级为 0x80000000说明对应的地址不能 作为默认路由器地址使用,尽管它也包含中通告报文中。优先级的默认值一般为 0。

ICMP差错报文

ICMP差错报文共5种
1.终点不可达
2.源点抑制,当路由器或主机由于拥塞而丢弃数据时发生向源点。
3.时间超过,收到生存时间为0数据报。
4.参数问题
5.改变路由

ICMP端口不可达差错报文例举:


ICMP端口不可达报文的完整版⬆️

ICMP报文部分⬆️

ICMP主机与网络不可达差错

当路由器收到一份IP数据报但又不能转发时,就要发送一份ICMP主机不可达差错报文。

ICMP重定向差错

当IP数据报应当被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。

ICMP源站抑制差错

当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。注意限定词“可能”。 即使一个系统已经没有缓存并丢弃数据报,也不要求它一定要发送源站抑制报文。

ICMP报文处理

7.Ping程序

Ping程序目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答.

icmp_seq为发送的ID,在每个ICMP数据报的标识符上设置。
TTL为生存时间,位于IP首部中。
time为往返时间,在ICMP选项数据中记录发送时间,收到回答后计算而得。
通常第一个往返时间比其他的大。由于目的端硬件地址不在ARP高速缓存中。需要发生一个ARP请求并接受应答。


8.Traceroute程序

Traceroute程序工作机制

Traceroute程序发送一份TTL字段为1的IP数据报给目的主机。处理这份数据报的第一个路由器将TTL值减 1 ,丢弃该数据报,并发回一份超时ICMP报文。该ICMP超时报文包含该路由器的IP地址。然后Traceroute程序发送一份TTL为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。那么我们该如何判断是否已经到达目的主机了呢?
Traceroute程序发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文 。这样,Traceroute程序所要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束。

ip源站选路选项

源站选路(source routing)的思想是由发送者指定路由。它可以采用以下两种形式:
• 严格的源路由选择。发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路由失败”的ICMP差错报文。
• 宽松的源站选路。发送端指明了一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。


9.IP选路

简单路由表

查看本机路由表命令:netstat,-r选项的netstat命令列出路由表,-n命令以数字格式打印出IP地址。

对于一个给定的路由器,可以打印出五种不同的标志(flag):
U 该路由可以使用。
G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。它区分了间接路由和直接路由。发往直接路由的分组中不但具有指明目的端的IP地址,还具有其链路层地址。当分组被发往一个间接路由时,IP地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)
H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。
D 该路由是由重定向报文创建的(9.5节)。
M 该路由已被重定向报文修改(9.5节)。

参考记数Refcnt(Referencecount)列给出的是正在使用路由的活动进程个数。面向连接的协议如TCP在建立连接时要固定路由。

use显示的是通过该路由发送的分组数。如果我们是这个路由的唯一用户, 那么运行ping程序发送 5 个分组后,它的值将变为 5 。

最后一列(interface或Netif Expire)是本地接口的名字。

路由表的构建

通过ICMP重定向差错报文,ICMP路由器发现报文构件路由表,协议详细看第六章ICMP报文。


10.动态选路协议

Internet是以一组自治系统 (AS,Autonomous System)的方式组织的,每个自治系统通常由单个实体管理。常常将一个公司或大学校园定义为一个自治系统。每个自治系统可以选择该自治系统中各个路由器之间的选路协议。这种协议我们称之为内部网关协议IGP(Interior Gateway Protocol)或域内选路协议(intradomain routing protocol)。最常用的IGP是选路信息协议RIP。一种新的IGP是开放最短路径优先OSPF(Open Shortest Path First)协议。它意在取代RIP。
外部网关协议EGP(Exterier Gateway Protocol)或域内选路协议的分隔选路协议用于不同自治系统之间的路由器。在历史上,EGP有着一个与它名称相同的协议:EGP。新EGP是当前在NSFNET骨干网和一些连接到骨干网的区域性网络上使用的是边界网关协议BGP(Border Gateway Protocol)。BGP意在取代EGP。

RIP:选路信息协议

RIP是使用最为广泛也最受攻击的选路协议。

报文格式

RIP报文包含在UDP数据报中↓,RIP常用的UDP端口号是520。

RIP报文格式↓

命令字段为1表示请求,2表示应答。还有两个舍弃不用的命令3和4,两个非正式的命令:轮询 5和轮询表项 6。请求表示要求其他系统发送其全部或部分路由表。应答则包含发送者全部或部分路由表。
版本字段通常为1,而第2版RIP将此字段设置为2。
紧跟在后面的20字节指定地址系列(address family)(对于IP地址来说,其值是2)、IP地址以及相应的度量。 RIP的度量是以跳计数的。
采用这种20字节格式的RIP报文可以通告多达25条路由。上限25是用来保证RIP报文的总长度为20×25+4 = 504,小于512字节。由于每个报文最多携带25个路由,因此为了发送整 个路由表,经常需要多个报文。

运行

• 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送 一个请求报文,要求其他路由器发送完整路由表。在点对点链路中,该请求是发送给其他终点的。如果网络支持广播的话,这种请求是以广播形式发送的。目的UDP端口号是520(这是其他路由器的路由守护程序端口号)。 这种请求报文的命令字段为 1,但地址系列字段设置为 0,而度量字段设置为16。这是一 种要求另一端完整路由表的特殊请求报文。
• 接收到请求。如果这个请求是刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则,就处理请求中的每一个表项:如果有连接到指明地址的路由,则将度量设置成我们的值,否则将度量置为16(度量为16是一种称为“无穷大”的特殊值,它意味着没有到达目的的路由)。然后发回响应。
• 接收到响应。使响应生效,可能会更新路由表。可能会增加新表项,对已有的表项进行修改,或是将已有表项删除。
• 定期选路更新。每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器。发送路由表可以是广播形式的(如在以太网上),或是发送给点对点链路的其他终点的。
• 触发更新。每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表, 而只需要发送那些发生变化的表项。
每条路由都有与之相关的定时器。如果运行 RIP的系统发现一条路由在3分钟内未更新, 就将该路由的度量设置成无穷大(16),并标注为删除。这意味着已经在6个30秒更新时间里没收到通告该路由的路由器的更新了。再过60秒,将从本地路由表中删除该路由,以保证该路由的失效已被传播开。

度量

RIP使用的度量是以跳计算的。直接连接口条数记为1。16为不可达。

缺陷

RIP没有子网的概念。
在路由器或链路故障后需要很长时间才能稳定下来,因为定期更新时间为30秒。整个网络知道网络结构发生改变可能要几分钟。
使用跳数作为度量忽略了其他一些应该考虑的因素。

RIP版本2

RIP第二版改变第一版“必须为0”的字段传递一些额外的信息。

选路域(routing domain)是一个选路守护程序的标识符,它指出了这个数据报的所有者。 在一个Unix实现中,它可以是选路守护程序的进程号。该域允许管理者在单个路由器上运行多个RIP实例,每个实例在一个选路域内运行。
选路标记(routing tag)是为了支持外部网关协议而存在的。它携带着一个 EGP和BGP的自治系统号。
每个表项的子网掩码应用于相应的IP地址上。下一站IP地址指明发往目的IP地址的报文该发往哪里。该字段为0意味着发往目的地址的报文应该发给发送RIP报文的系统。
RIP-2提供了一种简单的鉴别机制。可以指定RIP报文的前20字节表项地址系列为0xffff, 路由标记为2。表项中的其余16字节包含一个明文口令。
最后,RIP-2除了广播(第12章)外,还支持多播。这可以减少不收听 RIP-2报文的主机的负载。

OSPF:开放最短路径优先

OSPF克服了RIP的所有限制。RIP采用距离向量协议,OSPF采用链路状态协议使得路由变化后稳定的更快。
距离向量:RIP发送的报文包含一个距离向量(跳数)。每个路由器都根据它所接收到邻站的这些距离向量来更新自己的路由表。
链路状态协议:路由器并不与其邻站交换距离信息。它采用的是每个路由器主动地测试与其邻站相连链路的状态,将这些信息发送给它的其他邻站,而邻站将这些信息在自治系统中传播出去。每个路由器接收这些链路状态信息,并建立起完整的路由表。

OSPF使用IP,在IP的protocol字段有自己的值。RIP使用UDP。

OSPF报文格式


度量

OSPF将度量交由网络管理人员来设定,比较灵活。

用于大规模网络

OSPF将一个自制系统划分为若干个更小的范围,叫做区域。这样做可以减少整个网络上的通信量。连接区域的路由器叫区域边界路由,连接其他自制系统的路由器叫自制系统边界路由器。

BGP:边界网关协议

BGP系统与其他BGP系统之间交换网络可到达信息。这些信息包括数据到达这些网络所 必须经过的自治系统AS中的所有路径。这些信息足以构造一幅自治系统连接图。然后,可以根据连接图删除选路环,制订选路策略。

BGP使用TCP作为传输层协议。

BGP通过定期发送keepalive报文给其邻站来检测TCP连接对端的链路或主机失败。两个报文之间的时间间隔建议值为 3 0秒。

CIDR:无类型域间选路

CIDR忽略ABCD型网络,采用网络号加主机号的方式寻址,在ip地址后使用/数字的方法表明IP地址前几位是网络号。可缓解IP地址耗尽问题。


11.UDP:用户数据报协议

UDP封装成IP数据报的格式

UDP首部


TCP和UDP端口号是相互独立的。但两个协议通常使用相同的端口号,目的是为使用方便。
UDP检验和检验了首部和数据部分,而IP只检验首部。计算检验和时要加上填充字节0。如果接收端检验出错,那么丢弃,不产生差错报文,和ip一样。

IP分片

任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
把一份IP数据报分片以后,只有到达目的地才进行重新组装。重新组装由 目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(TCP,UDP)是透明的, 除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。 I P首部中包含的数据为分片和重新组装提供了足够的信息。


12.广播和多播

IP地址分三种:单播地址,多播地址,广播地址。广播为对网上其他所有主机发生帧,多播则是有筛选的发生给几个主机。多播可减少对广播不感兴趣的主机的处理复核。

广播

受限的广播地址是255.255.255.255,在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅 出现在本地网络中。

指向网络的广播地址是主机号为全为1的地址。 一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

指向子网的广播地址为主机号为全 1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。

多播

IP多播提供两类服务:
1.向多个目的地址传送数据。
2.客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。

D类IP地址被称为多播组地址。通过将其低位23bit映射到相应以太网地址中便可实现多播组地址到以太网地址的转换。由于地址映射是不唯一的,因此需要其他的协议实现额外的数据报过滤。


13.IGMP:Internet组管理协议

如ICMP一样,IGMP也被当作 I P 层的一部分。IGMP报文通过IP数据报进行传输。不像我们已经见到的其他协议,IGMP有固定的报文长度,没有可选数据。

IGMP报文格式


IGMP类为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。检验和的计算和ICMP协议相同。组地址为D类IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。

IGMP报告和查询

多播路由器使用 I G M P 报 文 来 记 录 与 该 路 由 器 相 连 网 络 中 组 成 员 的 变 化 情 况 。 使 用 规 则 如
下:
1) 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
2) 进程离开一个组时,主机不发送IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
3) 多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个 IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
4) 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。


14.DNS:域名系统

DNS提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。

DNS报文格式


这个报文由12字节长的首部和4个长度可变的字段组成。
16bit的标志字段被划分为若干子字段,如下图所示。

标志字段中各子字段含义参考书145-146页。


15.TFTP:简单文件传送协议

TFTP:Trivial File Transfer Protocol,TFTP使用UDP,而FTP使用TCP。TFTP用于用户引导进程。

协议


操作码分5种,各操作码意义如图所示。
块编号的作用:用于发回ACK以确认ACK报文中携带的块编号所代表的data报文以确认接收。因为TFTP使用UDP需要这样的确认机制。若用户要求写,服务器返回0以确认用户可以写该文件。

安全性

TFTP分组中不提供用户名及口令,这是一个安全漏洞。大多数FTFP服务器提供了一个选项只能访问特定目录下的文件。


16.BOOTP:引导程序协议

BOOTP使用UDP,且通常与TFTP协同工作。

分组格式



事物标识:由客户设置并由服务器返回,客户用他对请求与应答进行匹配。

端口号

BOOTP服务器为67,BOOTP客户为68。


17.TCP:传输控制协议

TCP提供一种面向连接的,可靠的字节流服务。

TCP提供可靠性的方式

• 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同。应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。
• 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
• 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送, 通常将推迟几分之一秒。
•TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
• 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
• 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
•TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

TCP首部


序号(seq):用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的数据标号。序号是32bit的无符号数,序号到达2^32-1后又从0开始。

确认序号(ack):确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。表明ack-1的序号和之前的序号所代表的报文已经收到。只有ACK标志为1时确认序号字段才有效。

4位首部长度:又称数据偏移,指明TCP首部长度,因为TCP首部包含了选项字段。

URG(URGent 紧急):当URG=1时,表明该报文段含有紧急数据,应该拥有高的传送优先级。

ACK(ACKnowlegment 确认):当ACK=1时,确认序号字段有效,TCP规定,建立连接后所有报文段必须把ACK置1。

PSH(PuSH 推送):收端接受到PSH=1的报文时,就尽快的交付给应用层,而不必等到缓存满了在向上交付。

RST(ReSeT 复位):RST=1的报文表明当前TCP连接出现严重错误,需要断开重连。

SYN(SYNchronization 同步):SYN=1表明这是一个连接请求或连接接受报文。在SYN=1时,ACK=0表明该报文是连接请求报文,ACK=1表明该报文是连接接受报文。

FIN(FINis 终止):FIN=1时,表明此报文的发送方数据已经发生完毕,要求释放TCP连接。

窗口大小:窗口值作为接受方让发送方设置其发送窗口的依据。
检验和:检验TCP首部和数据的正确性。

紧急指针:当URG=1时有效。指出紧急数据的最后一字节位置偏移,用以区分一个报文中的紧急数据和普通数据。

选项:最常见的选项是MSS(Maximum Segment Size最大报文长度),MSS通常在第一个报文中出现。


18.TCP连接的建立与终止

TCP是面向连接的,在传送数据之前需要建立连接,而UDP不需要建立连接。

连接——三次握手


1.请求端(客户)发生一个SYN=1报文给服务器,说明请求建立连接,设此报文seq = x(由客户产生)。
2.服务器发回应答(ack = x+1),SYN=1且ACK=1表明服务器接受建立连接,设此报文seq = y(由服务器产生)。
3.客户对服务器同意报文发回确认(ack = y+1),此方式防止已经失效的连接请求突然又传送到了服务器。

断开——四次挥手

一个TCP是连接是全双工的,因此每方必须单独关闭。

1.客户传送完数据,希望关闭连接,发送FIN=1报文给服务器,设seq = u(由客户产生)。
2.服务器返回收到确认报文(ack = u+1)。
3.客户进入FIN-WAIT-2状态,不再向服务器发送数据,但服务器可以向客户发送数据,客户也需要返回确认报文。此时TCP处于半关闭状态。
4.服务器发送完数据之后,向客户发送FIN=1报文。设seq = w。
5.客户收到服务器的终止报文,发回确认收到服务器终止报文的报文(ack = w+1),在2MSL后客户将关闭连接,MSL在下边介绍。
6.服务器收到客户发来的确认报文,关闭连接。

MSL等待状态

MSL:Maximum Segment Lifetime,最大生存时间,即一个报文在网络中存活的最大时间。
设置2MSL等待可防止:
1.防止客户最后一个确认关闭的报文未被服务器收到。若服务器未收到ack = w+1的报文,那么服务器将重传seq=w的报文,客户就知道确认报文并未送达,需重传。
2.防止已失效的请求连接,等待MSL可保证已经失效的请求连接报文已消失。

复位报文段

出现复位报文段的几种情况
1.到不存在的端口的连接请求。对于UDP产生ICMP端口不可达报文,TCP则使用复位。
2.异常终止一个连接。服务器可识别是异常还是正常关闭连接。
3.检测半打开连接。如果连接的一方已经关闭或异常终止而另一方不知道,这样的TCP连接称为半打开连接。

同时打开

当将要进行TCP连接的两端都主动与对方建立连接则称为同时打开。TCP可处理同时打开,只建立一条TCP连接。

同时关闭

TCP允许同时关闭。


19.TCP的交互数据流

经受时延的确认

TCP不必接收到一个报文马上发回确认,而是可以经过一些延时再确认,这样可以减少确认报文的数量,也可以在数据报文中携带确认。这样可以减少网络通信量。规定时延必须小于500ms.。

Nagle算法

Nagle算法用于广域网上的小分组。小分组中携带数据较少,由于TCP/IP首部会增加报文体积,时延大量的小分组将会造成浪费与拥塞。Nagle算法要求一个TCP连接上只能有一个未被确认的小分组。在收到确认之前累计小分组数据,合并成较大分组下次发送,该算法有自适应性,在网络越快的情况下累积的小分组数目越少。


20.TCP的成块数据流

滑动窗口

窗口的表示


图中状态表明:1-3字节的数据已经被接收方确认,窗口大小是由接收方通告的,所以该窗口覆盖了4-9字节。表明4-9字节的数据可以被立即发送。

关于窗口移动的几个名词:

1.窗口合拢,窗口左边向右靠近,这种现象发生在数据被发送和确认时
2.窗口张开,窗口右边向右移动,这种现象发生在另一端接收进程读取已确认的数据并释放TCP接收缓存时。
3.窗口收缩,窗口右边向左移动,虽然强烈建议不要使用这一的方式,但TCP必须能处理。

例子


1) 发送方不必发送一个全窗口大小的数据。
2) 来自接收方的一个报文段确认数据并把窗口向右边滑动。这是因为窗口的大小是相对于确认序号的。
3) 正如从报文段7到报文段8中变化的那样,窗口的大小可以减小,但是窗口的右边沿却不能够向左移动。
4) 接收方在发送一个ACK前不必等待窗口被填满。在前面我们看到许多实现每收到两个报文段就会发送一个ACK。

慢启动(慢开始)

慢启动为发送方的TCP增加了另一个窗口:拥塞窗口,记为cwnd。拥塞窗口被初始化为1,每收到一个ACK就令拥塞窗口加一(拥塞窗口以指数规模递增),发送方取拥塞窗口与通告窗口中最小值作为发送上限。
在窗口递增的某个时间点可能发生了拥塞,中间路由将丢球报文,而发送方不能按时接收到确认,则推测出避免拥塞的窗口大小。


21.TCP的超时与重传

避免拥塞和慢启动算法

慢启动使cwdn大小呈指数增长,而避免拥塞使cwdn每次+1。
避免拥塞算法经常和慢启动算法一起实现。拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。这样得到的算法的工作过程如下:
1) 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
2) TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。
3)当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半(cwnd和接收方通告窗口大小的最小值,但最少为2个报文段)。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)。
4) 当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。 慢启动一直持续到我们回到当拥塞发生时所处位置的一半时候才停止,然后转为执行拥塞避免。

快重传与快恢复算法


在收到重复的ACK时可能发生了:一些报文段被重新排序,或一些报文段丢失了。通常认为重复收到3次ACK就发生了丢失。
快重传与快恢复算法过程:
1) 当收到第3个重复的ACK时,就执行”乘法减小”算法,使慢开始门限ssthresh减半,
2) 把cwnd设置为减半后的ssthresh的数值。然后执行避免拥塞算法。

重新分组

当TCP超时重传时,不一定要重传同样的报文段。TCP允许重新分组而发送一个较大的报文段以提高性能。TCP使用的序号是基于字节序号的,使得协议可以支持重新分组。


22.TCP的坚持定时器

TCP坚持定时器

我们已经看到TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。如果窗口大小为0会发生什么情况呢?这将有效地阻止发送方传送数据,直到窗口变为非0为止。
当发送方接收到窗口值不为0的报文段时,它打开被的窗口并立即开始发送数据。TCP必须能够处理打开此窗口的ACK(右接收方发来窗口变为非0的报文)丢失的情况。ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含有数据的ACK报文段。 如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器 (persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查(windowprobe)。

糊涂窗口综合征

糊涂窗口综合征SWS(Silly Window Syndrome):当发送端应用进程产生数据很慢或接收端应用程序处理接收缓冲区数据很慢,或二者兼有。就会使应用程序间传送的报文段很小,极端情况下为1字节数据的报文。

避免糊涂窗口综合征的方法:

1.接收方不通告小窗口,不轻易增大窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0), 除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间的一半,不论实际有多少。
2) 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据: ( a )可以发送一个满长度的报文段; ( b )可以发送至少是接收方通告窗口大小一半的报文段; ( c )可以发送任何数据并且没有还未被确认的数据或者该连接禁止使用Nagle算法。

23.TCP的保活定时器

当一个的TCP连接被建立后,即使双方都一直不发送任何数据,该连接也会继续存在。假如连接双方的某一端发送故障,那么另一端将会无休止的等待下去。保活定时器的作用就是解决这一问题。
当某一端发送数据后,保活定时器被启动,定时的时间可以设置,但不小于2小时。当有新的数据报到达时,保活定时器被重置。当保活定时器到达定时时间后,意味着双方已经至少2小时没有互相发送数据报。那么一端将会发送一个报文给另一端以探测其是否正常工作。
如果这时另一端正常工作,但是刚好进行重启,那么将无法回复报文。所以需要进行多次探测(10次,每次间隔75秒),若全部没有响应则认为另一端无法正常工作,需终止连接。


24.TCP的未来和性能

窗口扩大选项

窗口扩大选项使TCP的窗口定义从16bit增加为32bit。这并不是通过修改TCP首部来实现 的,TCP首部仍然使用16bit,而是通过定义一个选项实现对16bit的扩大操作来完成的。于是TCP在内部将实际的窗口大小维持为32bit的值。
这个选项只能够出现在一个SYN报文段中,因此当连接建立起来后,在每个方向的扩大因子是固定的。为了使用窗口扩大,两端必须在它们的SYN报文段中发送这个选项。主动建立连接的一方在其SYN中发送这个选项,但是被动建立连接的一方只能够在收到带有这个选项的SYN之后才可以发送这个选项。每个方向上的扩大因子可以不同。
假定我们正在使用窗口扩大选项,发送移位记数为S,而接收移位记数则为R。于是我们从另一端收到的每一个16bit的通告窗口将被左移R位以获得实际的通告窗口大小。每次当我们向对方发送一个窗口通告的时候,我们将实际的32bit窗口大小右移S比特,然后用它来替 换TCP首部中的16bit的值。

时间戳选项

时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值, 从而允许发送方为每一个收到的ACK计算RTT。

PAWS:防止回绕的序号

在高速网络中,一个还未到达接收端的序号可能被重新使用,使接收端产生错误应答或拼装等问题,PAWS算法使用时间戳选项。结合时间戳可判断是否发生了序号回绕。

T/TCP:为事务用的TCP扩展

如今一个应用程序设计人员面对的一种选择是使用TCP还是UDP。TCP提供了过多的事务特征,而UDP提供的则不够。通常应用程序使用UDP来构造(避免TCP连接的开销),而许多需要的特征(如动态超时和重传、拥塞避免等)被放置在应用层,一遍又一遍的重新设计和实现。一个较好的解决方法是提供一个能够提供足够多的事务处理功能的运输层。我们在本节所介绍的事务协议被称为T/TCP。T/TCP可避免三次握手和缩短WAIT_TIME状态。


25.SNMP: 简单网络管理协议

SNMP:Simple Network Management Protocol简单网络管理协议,管理进程和代理进程之间的通信协议。
管理进程和代理进程之间的通信可以有两种方式。一种是管理进程向代理进程发出请求, 询问一个具体的参数值(例如:你产生了多少个不可达的ICMP端口?)。另外一种方式是代理进程主动向管理进程报告有某些重要的事件发生(例如:一个连接口掉线了)。当然,管理进程除了可以向代理进程询问某些参数值以外,它还可以按要求改变代理进程的参数值(例如:把默认的IP TTL值改为64)。
在SNMP中往往使用UDP协议,所以可能发生管理进程和代理进程之间 数据报丢失的情况。因此一定要有超时和重传机制。

协议

SNMP定义了5种报文:
1) get-request操作:从代理进程处提取一个或多个参数值。
2) get-next-request操作:从代理进程处提取一个或多个参数的下一个参数值。
3) set-request操作:设置代理进程的一个或多个参数值。
4) get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的。它 是前面3中操作的响应操作。
5) trap 操作:代理进程主动发出的报文,通知管理进程有某些事情发生。


26.Telnet和Rlogin:远程登录

在TCP/IP网络上,有两种应用提供远程登录功能。
1) Telnet是标准的提供远程登录功能的应用,几乎每个TCP/IP的实现都提供这个功能。它能够运行在不同操作系统的主机之间。Telnet通过客户进程和服务器进程之间的选项协商机制,从而确定通信双方可以提供的功能特性。
2) Rlogin起源于伯克利Unix,开始它只能工作在Unix系统之间,现在已经可以在其他操作系统上运行。

Telnet

Telnet:telecommunication network protocol 电信网络协议。下图显示的是一个Telnet客户和服务器的典型连接图。

NVT网络虚拟终端

Telnet可在不同的系统间运行是因为使用了NVT。
NVT:Network Virtual Terminal网络虚拟终端。NVT是虚拟设备,连接的双方,即客户机和服务器,都必须把它们的物理终端和NVT进行相互转换。也就是说,不管客户进程终端是什么类型 , 操作系统必须把它转换为NVT格式。同时,不管服务器进程的终端是什么类型,操作系统必须能够把NVT格式转换为终端所能够支持的格式。

Telnet命令

Telnet的命令以0xff开头,若发生数据0xff就连续发送两个0xff。

27.FTP:文件传送协议

FTP提供的文件传送是将一个完整的文件从一个系统复制到另一个系统中。使用熟知端口21。它在客户进程和服务器进程之间使用两个TCP连接:一个控制连接,它一直持续到客户进程与服务器进程之间的会话完成为止;另一个按需可以随时创建和撤消的数据连接。


剩下的章节讲的都是一些应用TCP/IP的应用层协议,暂时涉及不到。

以上是关于TCP/IP详解-协议的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP详解,卷1:协议--第6章 ICMP:Internet控制报文协议

TCP/IP详解 卷1:协议—ICMP:Internet控制报文协议

TCP/IP详解 卷1:协议—ICMP:Internet控制报文协议

TCP/IP详解 卷1:协议—ICMP:Internet控制报文协议

TCP/IP详解 卷1:协议—ICMP:Internet控制报文协议

TCP/IP详解 卷1:协议—IP:网际协议