计算机网络(TCP/IP)

概述:网络协议通常分不同的层次进行开发,每一层分别不同的通信功能。TCP/IP通常分为4层协议系统。

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

2.网络层,有时也称为互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中。网络层协议包括IP(网际协议),ICMP(Internet互联网控制报文协议)、IGMP(Internet组管理协议)

3.运输层只要为俩台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有俩个互不相同的传输协议:TCP(传输控制协议)、UDP(用户数据报协议)。TCP为俩台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是称作数据报的分组从一台主机发送到另一台主机,但不保证该数据报能到达另一端。任何必须的可靠性必须有应用层来提供。这俩种运输层协议分别在不同的应用程序中有不同的用途。

4.应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面的这些通用的应用程序:Telnet远程登录、FTP文件传输协议、SMTP简单邮件传送协议、SNMP简单网络管理协议

互联网的地址:互联网上的每一个接口必须有一个唯一的Internet地址(IP地址),IP地址长32bit。

由于互联网上的每个接口必须有一个IP地址,因此必须要有一个管理机构为接入互联网的网络分配IP地址。这个管理机构就是互联网信息中心称为InterNIC。他只分配网络号,主机号有管理员来负责。

域名系统:尽管通过IP地址可以识别主机上的网络接口,进而访问主机,但是人们最喜欢使用的还是主机名。在TCP/IP 领域中,域名系统(DNS)是一个分布的数据库,由它来提高IP地址和主机名的映射信息。

封装:数据被送入协议族中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时候还要增加尾部信息)TCP传给IP的数据单元称为TCP报文段,IP传给网络接口层的数据单元称作IP数据报。通过以太网传输的比特流称作为帧。

分用:当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。

链路层:TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、FDDI(光纤分布式数据接口)和RS-232串行线路等

主要有三个目的:

1.为IP模块发送和接收IP数据报

2.为ARP模块发送ARP请求个接收ARP应答

3.为RARP发送RARP请求和接收RARP应答

以太网和IEEE802封装:

在TCP/IP世界中,以太网IP数据报的封装是在RFC 894中定义的,IEEE 802 网络的IP数据报封装是在RFC 1042(IEEE802)中定义的。

目的地址和源地址:MAC地址,在ARP和RARP协议对IP地址和MAC地址进行映射。

长度:指它后续数据的字节长度,但不包括CRC检验码。

目的服务服务点(DSAP)和原服务服务点(SSAP):都设置为0xaa。

Ctrl:值为3

org code:都为0

类型:IP数据报、ARP请求/应答、RARP请求/应答

CRC:用于帧内后续字节差错的循环冗余码检验

数据报:IEEE802最小为38字节,而以太网为46字节,如果不足则插入填充字节。

SLIP:串行线路IP,是一种在串行线路上对IP数据报进行封装的简单形式,SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet。

SLIP协议定义的数据帧:

1.IP数据报以一个称作END(0xc0)的特殊字符结束。同时为了防止数据报到来之前的线路噪声被当作数据报的内容,大多数数据报的开头也传一个END字符,

2.如果IP报文中某个字符为END,那么就要连续传输俩个字符0xdb和0xdc来取代他。0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与SACII字符(0x1b)不同。

3.如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输俩个字符0xdb和0xdd来取代他

缺陷:

1.每一端必须知道对方的IP地址,没办法吧本地的IP地址通知给另一端。

2.数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于SLIP,那么就不能使用其他协议。

3.SLIP没有在数据帧中加入检验和(类似于以太网中的CRC字段)。如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来实现(另一种方式是新型的调制解调器可以检测并纠正错误报文)。

压缩的SLIP:由于串行线路的速率通常较低,而且通信经常是交互式的(如Telnet和Rlogin),因此SLIP线路上有许多小的TCP分组进行交换。为了传送1个字节的数据需要20个字节的IP首部和20个字节的TCP首部。于是提出了一个被称作CSLIP(压缩的SLIP)的新协议,把上面的40个字节压缩到3-5个字节,能在CSLIP的每一端维持多达16个TCP连接。

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

1.在串行链路上封装了IP数据报的方法。PPP即支持数据为8位和无奇偶检验的异步模式(如大多数计算机上都普遍存在的串行接口),还支持面向比特的同步链接。

2.建立、配置及测试数据链路的链路控制协议(LCP)体系,它允许通信双方进行协商,已确定不同的选项。

3.针对不同网络层协议的网络控制协议(NCP)体系,当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk。

每一帧以标志符0x7e开始和结束。紧接着是一个地址字节,值始终是0xff,然后是一个值为0x33的控制字节。接下来是协议字段,类似于以太网中类型字段的功能。CRC字段是一个循环冗余检验码,以检测数据帧中的错误。

由于标志字段的值是0x7e,因此当该字符出现在信息字段中时,PPP需要对它进行转义,在同步链路中,采用比特填充的硬件技术来完成(0x7e:1111110,当遇到5个1时插入一个0)。在异步链路:

1.当遇到字符0x7e时,需要连续传送俩个字符:0x7d和0x5d,实现标志字符转义(0x7e ^ 0x20 = 0x5e) 

2.当遇到转义字符0x7d时,需连续传送俩个字符:0x7d和0x5d。 

3.默认情况下,如果字符的值小于0x20,一般都要进行转义,例如字符 0x01 会被转义为两个连续字符 0x7d 和 0x21。

PPP比SLIP具有下面这些优点:

1.PPP协议在单根串行线路上运行多种协议,不只是PPP协议

2.每一帧都有循环冗余检验

3.通信双方可以进行IP地址的动态协商(使用IP网络控制协议)

4.与CSLIP类似,对TCP和IP报文首部进行压缩

5.链路控制协议可以对多个数据链路选项进行设置。

 环回接口:大多数的产品都支持回环接口,以允许运行在同一台主机上的客户程序和服务器通过TCP/IP进行通信,A类网络号127就是为环回接口预留的,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。

最大传输单元MTU:以太网和802.3对数据帧的长度都有一个限制,其最大值分别为1500和1492字节(多了8个控制字节),如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片,把数据报分成若干片。

IP网际协议:IP是TCP/IP协议族最为核心的协议。所有的TCP、UDP、ICMP、IGMP数据都以IP数据报格式传输。是一种不可靠传输、无连接的传输方式,不可靠传输意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。任何要求可靠性必须由上层来提供(如TCP) 。无连接是IP并不维护任何关于后续数据报的状态信息。每一个数据报的处理是相互独立的。IP数据报可以不按发送顺序接收。

IP首部:普通的IP首部长为20个字节,除非含有选项字段。

版本号:目前是4即IPV4

首部长度是指首部占32bit字的数目,包括任何选项。由于它是一个4比特字段,因此首部最长为60个字节(4字节*15)

TOS(8位服务类型):包括一个3bit的优先权子字段(现在已被忽略),4bit的TOS子字段和1bit未用位但必须置为0。4bit的TOS分别为:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit为1,如果所有4bit均为0,那么就意味着是一般服务。

总长度:指整个IP数据报的长度,以字节单位。所以IP数据报最大长度可达65535字节。尽管可以传送65535字节的数据报,但是大多数的链路层都会对它进行分片。而且主机也要求不能接收超过576字节的数据报。由于TCP把用户数据分成若干片,因此一般来说这个限制不会影响TCP。

标识字段:唯一的标识主机发送的每一份数据。通常每发送一份报文它的值就会加一。

TTL:数据报可以经过的最多路由器。它指定了数据报的生存时间。

协议字段:根据他可以识别出那个协议向IP传送数据

首部检验和:首部检验和字段是根据IP首部计算的检验和码。它不对首部后面的数据进行计算。ICMP、IGMP、UDP、TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。为了计算一份数据报的检验和,首先把检验和字段置为0,然后对首部中每一个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每一个16bit进行二进制反码求和。ICMP、IGMP、UDP、TCP都采用相同的检验和算法。

 

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

在一般的体制中,IP可以从TCP、UDP、ICMP、IGMP接受数据报并进行发送,或者从一个网络接口接受数据报并进行发送。IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时IP首先检查目的的IP地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的不是这些地址,那么如果IP层被设置为路由器的功能,那么就对数据报进行转发(也就是说,像下面对待发出的数据报一样处理),否则数据报被丢弃。

路由表中的每一项都包含下面这些信息:

1.目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址,有该表目中的标志字段来指定。主机地址有非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中所有的主机(如以太网、令牌环网)。

2.下一站(或下一跳)路由器的IP地址,或者有直接连接的网络IP地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一站路由器不是最终的目的,但是它可以吧传送给他的数据报转发到最终目的

3.标志。其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站的路由器是否为真正的下一站路由器,还是一个直接相连的接口。

4.为数据报的传输指定一个网络接口

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

1.搜索路由表,寻找能与目的地址完全相匹配的表目(网络号和主机号都要匹配),如果找到,则把报文发送给该表目指定的下一站路由器或者直接相连的网络接口。

2.搜索路由表,寻找能与目的网络号向匹配的表目,如果找到,则把报文发送给该表目指定的下一站路由器或者直接相连的网络接口。目的网络上的所有主机都可以通过这个表目来处置。例如一个以太网上的所有主机都是通过这种表目进行寻径的。这种搜索网络的方法必须考虑可能的子码掩码。

3.搜索路由表,寻找标为默认的表目,如果找到则把报文发送给该表目指定的下一站路由器。

完整的主机地址匹配在网络号匹配之前,只有当它们都失败的时候才选择默认路由。为一个网络指定一个路由器,而不必为每一个主机指定一个路由器,这是IP路由选择机制的另一种特性,可以极大地缩小路由表的规模。

子网寻址:现在所有的主机都要求支持子网编址,不是把IP地址看成有单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网和一个主机号。这样做的原因是A类和B类地址为主机号分配了太多的空间。

子网掩码:任何主机 在引导时进行的部分配置是指定主机的IP地址,大多数系统把IP地址存在一个磁盘文件里供引导时读取。除了IP地址以外,主机还需要指定多少比特用于子网号及多少比特用于主机号,这通过子码掩码确定的。其中值为1的比特留给网络号和子网号,0比特留给主机号。

给定IP地址和子码掩码以后,主机就可以确定IP数据报的目的是(IP地址和子码掩码作与运算):

1.本子网上的主机

2.本网络中的其他子网中的主机

3.其他网络上的主机

特殊情况的IP地址:0表示全部为0,-1表示全部为1。n e t i d、s u b n e t i d和h o s t i d分别表示不为全0或全1的对应字段。子网号栏为空表示该地址没有进行子网划分。

ARP:地址解析协议,为IP地址到对应的硬件地址之间提供动态映射。我们之所以用动态这个词是因为这个过程是自动完成的。

ARP高速缓存:ARP高效运行的关键是由于每一个主机上都有一个ARP的高速缓存,存放了最近Internet地址到硬件地址之间的映射记录。

ARP分组格式:

目的地址:全 1的特殊地址,是广播地址。
帧类型:对于ARP请求和应答来说是0x0806

硬件类型:1表示以太网地址

协议类型:表示要映射的协议地址类型,它的值是0x0800。

硬件地址长度和协议地址长度:对于以太网上IP地址的ARP请求或应答来说,它们的值分别为 6和4。

操作字段(OP):它们是 ARP请求(值为1)、ARP应答(值为2)、RARP请求、(值为3)和RARP应答(值为4)

ARP代理:如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求。

RARP逆地址解析协议:用于将MAC地址转换为IP地址。

工作原理:

1.发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;

2.本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;

3.如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;

4.如果不存在,RARP服务器对此不做任何的响应;

5.源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。

ICMP(Internet控制报文协议):传递差错报文以及其他需要注意的信息。ICMP报文经常被IP层或更高协议(TCP、UDP)使用,一些ICMP报文把差错报文返回给用户进程。

ICMP封装在IP数据内部,有IP首部但数据是ICMP报文。所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。

ICMP地址掩码请求和应答报文:ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。

标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。

ICMP时间戳请求:允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间。

请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值(提供三个字段的原因是可以让发送方分别计算发送请求的时间和发送应答的时间)。

ICMP端口不可达差错:ICMP的一个规则是,ICMP差错报文(参见图6 - 3的最后一列)必须包括生成该差错报文的数据报I P首部(包含任何选项),还必须至少包括跟在该 I P首部后面的前8个字节。

动态选路协议(RIP):它用于路由器间的通信。我们主要讨论 RIP,即选路信息协议。当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器之间必须采用选路协议进行通信,这样的选路协议有很多种。路由器上有一个进程称为路由守护程序( routing daemon),它运行选路协议,并与其相邻的一些路由器进行通信。动态选路是内核搜索路由表,查找主机路由、网络路由以及默认路由的方式。但是放置到路由表中的信息改变了 — 当路由随时间变化时,路由是由路由守护程序动态地增加或删除。

RIP报文:包含中在UDP数据报中

命令字段:1表示请求,2表示应答。还有两个舍弃不用的命令( 3和4),两个非正式的命令:轮询( 5)和轮询表项( 6)。

版本字段:通常为1,而第2版R I P(1 0 . 5节)将此字段设置为2。

紧跟在后面的20字节指定地址系列采用这种20字节格式的RIP报文可以通告多达 25条路由。上限25是用来保证RIP报文的总长度为2 0×25 + 4 = 504,小于512字节。由于每个报文最多携带 25个路由。

正常运行:

1.初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。在点对点链路中,该请求是发送给其他终点的。如果网络支持广播的话,这种请求是以广播形式发送的。

2.接收到请求。如果这个请求是刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则,就处理请求中的每一个表项:如果有连接到指明地址的路由,则将度量设置成我们的值,否则将度量置为 1 6(度量为1 6是一种称为“无穷大”的特殊值,它意味着没有到达目的的路由)。然后发回响应。

3.接收到响应。使响应生效,可能会更新路由表。可能会增加新表项,对已有的表项进行修改,或是将已有表项删除。

4.定期选路更新。每过3 0秒,所有或部分路由器会将其完整路由表发送给相邻路由器。发送路由表可以是广播形式的(如在以太网上),或是发送给点对点链路的其他终点的。

5.触发更新。每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表,而只需要发送那些发生变化的表项。

度量:RIP所使用的度量是以跳 ( hop )计算的。所有直接连接接口的跳数为 1。跳数的最大值是 15,这意味着RIP只能用在主机间最大跳数值为 15。度量为16表示到无路由到达该IP地址。

UDP:是一个简单的面向数据报的运输层协议,进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的 IP数据报。UDP不提供可靠性:它把应用程序传给 IP层的数据发送出去,但是并不保证它们能到达目的地。

UDP检验和:UDP检验和覆盖UDP首部、UDP伪首部和UDP数据。回想IP首部的检验和,它只覆盖IP的首部 — 并不覆盖IP数据报中的任何数据。UDP的检验和是可选的,而TCP的检验和是必需的。

与前面的检验和不同点:

1. UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个 16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。

2.UDP数据报和TCP段都包含一个1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含 IP首部一些字段。其目的是让 UDP两次检查数据是否已经正确到达目的地

(例如,IP没有接受地址不是本主机的数据报,以及 IP没有把应传给另一高层的数据报传给UDP)。

 IGMP:Internet管理组协议。它让一个物理网络上的所有系统知道主机当前所在的多播组。

这是版本为1的I G M P。I G M P类型为1说明是由多播路由器发出的查询报文,为 2说明是主机发出的报告报文。检验和的计算和 I C M P协议相同。组地址为D类I P地址。在查询报文中组地址设置为 0,在报告报文中组地址为要参加的组地址。

加入一个多播组:多播的基础就是一个进程的概念,该进程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的 — 它随时因进程加入和离开多播组而变化。

IGMP报告和查询:多播路由器使用I G M P报文来记录与该路由器相连网络中组成员的变化情况。

1.当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。

2.进程离开一个组时,主机不发送 IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的 IGMP查询中就不再发送报告报文。

3.多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。

4. 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。

DNS域名系统:是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和 IP地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在 Internet上的单个站点不能拥有所有的信息。每个站点(如大学中的系、校园、公司或公司中的部门)保留它自己的信息数据库,并运行一个服务器程序供 Internet上的其他系统(客户程序)查询。 DNS提供了允许服务器和客户程序相互通信的协议。

域名:

顶级域名被分为三个部分:

1.arpa:是一个用作地址到名字转换的特殊域

2.7个3字符长的普通域。有些书也将这些域称为组织域。

3.所有2字符长的域均是基于I S O 3 1 6 6中定义的国家代码,这些域被称为国家域,或地理域。

三字节长的普通域:

com:商业组织

edu:教育机构

gov:其他美国政府部门

int:国际组织

mil:美国军事网点

net:网络

org:其他组织

DNS报文格式:这个报文由1 2字节长的首部和4个长度可变的字段组成。

标识字段:由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。

标志字段:

1. QR 是1 bit字段:0表示查询报文,1表示响应报文。

2.opcode是一个4 bit字段:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。

3.AA是1 bit标志,表示“授权回答 (authoritative answer)”。该名字服务器是授权于该域的。

4.TC是1 bit字段,表示“可截断的 ( truncated)”。使用UDP时,它表示当应答的总长度超过5 1 2字节时,只返回前5 1 2个字节。

5.RD是1 bit字段表示“期望递归”。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。

6.RA是1 bit字段,表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为1。

7.随后的3 bit字段必须为0。

8. rcode是一个4 bit的返回码字段。通常的值为 0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。

TCP:提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用 TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个 TCP连接。

通过以下方式提供可靠性:

1.应用数据被分割成TCP认为最适合发送的数据块。

2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

4.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, T C P将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

5.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此 TCP报文段的到达也可能会失序。如果必要, TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

6.既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

7.TCP还能提供流量控制。 TCP连接的每一方都有固定大小的缓冲空间。 TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

TCP数据报:

源端和目的端的端口号:用于寻找发端和收端应用进程。这两个值加上IP首部中的源端I P地址和目的端I P地址唯一确定一个TCP连接。

序号:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 TCP用序号对每个字节进行计数。序号是32 bit的无符号数,序号到达2 3 2 -1后又从0开始。当建立一个新的连接时, SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN,该主机要发送数据的第一个字节序号为这个 ISN加1,因为SYN标志消耗了一个序号。

字节序号:TCP 连接中,为传送的字节流(数据)中的每一个字节按顺序编号。也就是说,在一次 TCP 连接建立的开始,到 TCP 连接的断开,你要传输的所有数据的每一个字节都要编号。这个序号称为字节序号。

确认序号:既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1。只有ACK标志(下面介绍)为 1时确认序号字段才有效。

首部长度:给出首部中32 bit字的数目。

在TCP首部中有6个标志比特。它们中的多个可同时被设置为 1。

1.URG:紧急指针

2.ACK:确认序号有效

3.PSH:接收方应该尽快将这个报文段交给应用层。

4.RST:重新连接

5.SYN:同步序号用来发起一个连接。

6.FIN:发端完成发送任务。

窗口大小:提供TCP的流量控制,窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。

检验和:覆盖了整个的TCP报文段:TCP首部和TCP数据。 TCP检验和的计算和 UDP检验和的计算相似,使用伪首部。

紧急指针:只有当URG标志置为1时紧急指针才有效,紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

TCP连接的建立和终止:TCP是一个面向连接的协议。

建立连接:这三个报文段完成连接的建立。这个过程也称为三次握手。

1.请求端(通常称为客户)发送一个 SYN段指明客户打算连接的服务器的端口,以及初始序号,这个S Y N段为报文段1。

2.服务器发回包含服务器的初始序号的 SYN报文段作为应答,同时,将确认序号设置为客户的 ISN 加1以对客户的 SYN 报文段进行确认。一个 SYN 将占用一个序号。

3.客户必须将确认序号设置为服务器的 ISN 加 1 以对服务器的 SYN 报文段进行确认。

连接终止协议:四次挥手,这是由TCP的半关闭造成的。

1.客户端发起终止连接,发送一个FIN,用来关闭从客户到服务器是数据传送。

2.当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加一。

3.同时 TCP 服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN。(确认帧和终止连接请求不一起是服务器可能好没发完数据)

4.客户端发回确认帧。

 TCP的交互数据流:

按照分组数量计算,约有一半的T C P报文段包含成块数据,另一半则包含交互数据。很明显,T C P需要同时处理这两类数据,但使用的处理算法则有所不同。

交互式输入:每次从客户传到服务器的是一个字节的按键(而不是每次一行)。需要远程系统(服务器)回显我们(客户)键入的字符。这样就会产生4个报文段:(1)来自客户的交互按键;(2)来自服务器的按键确认;(3)来自服务器的按键回显;( 4)来自客户的按键回显确认。

Nagle算法:每发送一个字节的数据则要产生20字节的IP首部和20字节的TCP首部。该算法要求一个 TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。这是解决拥塞的情况,一般用在广域网上而不是局域网上。

TCP的成块数据流:

滑动窗口协议:该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。

我们使用三个术语来描述窗口左右边沿的运动:

1.称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。

2.当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了 TCP的接收缓存时。

3.当右边沿向左移动时,我们称之为窗口收缩。

窗口大小:由接收方提供的窗口的大小通常可以由接收进程控制,这将影响 TCP的性能。4.2BSD默认设置发送和接受缓冲区的大小为2048个字节。在4.3BSD中双方被增加为4096个字节。正如我们在本书中迄今为止所看到的例子一样, SunOS 4.13、BSD/386和SVR4仍然使用4096字节的默认大小。其他的系统,如Solaris 2.2、4.4BSD和AIX3.2则使用更大的默认缓存大小,如8192或16384等。

PUSH标志:发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与 PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据。通过允许客户应用程序通知其 TCP设置PUSH标志,客户进程通知 TCP在向服务器发送一个报文段时不要因等待额外数据而使已提交数据在缓存中滞留。类似地,当服务器的 TCP接收到一个设置了PUSH标志的报文段时,它需要立即将这些数据递交给服务器进程而不能等待判断是否还会有额外的数据到达。

慢启动:发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。会严重降低了TCP连接的吞吐量的。

慢启动为发送方的T C P增加了另一个窗口:拥塞窗口,记为cwnd,当与另一个网络的主机建立 TCP连接时,拥塞窗口被初始化为 1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。

TCP的超时和重传:

对每个连接,TCP管理4个不同的定时器:

1.重传定时器使用于当希望收到另一端的确认。

2.坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。

3.保活定时器可检测到一个空闲连接的另一端何时崩溃或重启。

4.2MSL定时器测量一个连接处于 TIME _ WAIT状态的时间。

往返时间测量:TCP超时与重传中最重要的部分就是对一个给定连接的往返时间( RTT)的测量。由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化, TCP应该跟踪这些变化并相应地改变其超时时间。

拥塞避免算法:分组丢失有俩种情况:发生超时和接收到重复的确认。

拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口 cwnd和一个慢启动门限 ssthresh。这样得到的算法的工作过程如下:

1.对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。

2.TCP输出例程的输出不能超过 cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

3.当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半( cwnd和接收方通告窗口大小的最小值,但最少为 2个报文段)。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)。

4.当新的数据被对方确认时,就增加 cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如果 cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止(因为我们记录了在步骤 2中给我们制造麻烦的窗口大小的一半),然后转为执行拥塞避免。

快速重传和恢复算法:

1.当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口 cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。

2.每次收到另一个重复的 ACK时,cwnd增加1个报文段大小并发送 1个分组(如果新的cwnd允许发送)。

3.当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤 1中重传的确认。另外,这个 ACK也应该是对丢失的分组和收到的第 1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。(该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。)

 TCP的坚持计时器:专门为对付零窗口通知而设立的。当发送端收到零窗口的确认时,就启动坚持计时器,当坚持计时器截止期到时,发送端TCP就发送一个特殊的报文段,叫探测报文段,这个报文段只有一个字节的数据。 TCP不对窗口探查报文段进行确认, TCP只确认那些包含有数据的窗口探查报文段。如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非 0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器来周期性地向接收方查询,以便发现窗口是否已增大。

 

posted @ 2019-08-13 22:26  小xxxx程序员  阅读(1535)  评论(0编辑  收藏  举报