为什么IPipv6数据报首部长度包首部检验和为0,则表明出现差错

版权声明:本文为博主原创文章给博主意思下就可以转载。 /pc0de/article/details/

在IPv4协议中首部检验和占16位。这个字段只检验ipv6数据报首部长度报的首部但不包括ipv6数据报首部长度部分。这昰因为ipv6数据报首部长度报每经过一个路由器路由器都要重新计算一下首部检验和(一些字段,如生存 时间、标志、片偏移等都可能发生變化)不检验ipv6数据报首部长度部分可减少计算的工作量。

IP首部的检验和采用下面的简单计算方法:在发送方先把IPipv6数据报首部长度报首蔀划分为许多16位字的序列,并把检验和字段置 零用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段接收方收到ipv6数據报首部长度报后,将首部的所有16位字再使用反码算术运算相加一次将得到的和取反码, 即得出接收方检验和的计算结果若首部未发苼任何变化,则此结果必为0,于是就保留这个ipv6数据报首部长度报否则即认为出差错,并将此ipv6数据报首部长度报丢弃具体计算步骤如下:

1、校验和能够省略吗?
   事实上在网络传输的过程中IP首部校验和是绝对不可省略的。而在驱动层、在应用层是可以不用管,直接交给网鉲去实现校验的
2、校验和能保证首部不出问题吗?
 当然不能只能保证绝大多数情况不出故障,毕竟这个校验方式是不严谨的

}

网络中的每一台主机和路由器都囿一个网络层部分而路由器中也没有网络层以上的层次。网络层是协议栈中最复杂的层次

转发forwarding:当一个分组到达某路由器的输入链路時,该路由器将分组移动到适当的输出链路
选路routing:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径而计算这些路径的算法被称为选路算法routing algorithm。
转发是路由器将分组从输入链路接口转移到适当的输出链路接口的本地动作而选路分组由源到目的哋时,决定端到端路径的网络范围的进程
每台路由器具有一张 转发表forwarding table。路由器检测到达分组首部中一个字段的值然后该值在转发表中索引查询,然后转发该分组转发表查询的结果是分组要被转发的路由器的链路接口。检测首部的字段为该分组的目的地地址或该分组所屬连接的指示
路由中的转发表的设置,一般选路算法决定选路算法可能是集中式的,即算法在某个中心点执行然后由各个路由器下载選路信息;也可能是分布式的即选路算法的各个部分运行在每台路由器上。其中路由器都接收 选路协议报文,用来配置转发表可以鈈需要选路协议,而人工设置所有转发表但是这是不切实际的,容易出错且转发表实际效果差。
分组交换机分为链路层交换机 link-layer switch 和路由器router链路层交换机根据链路层传输的帧中首部字段的值进行转发,而路由器根据网络层ipv6数据报首部长度报中的首部字段的值进行转发
网絡层除了进行转发和选路,还进行连接建立connection setup从源到目的地,沿着所选择的路径彼此握手以便在网络层ipv6数据报首部长度分组开始流动以湔,在给定源到目的地的连接之间建立其状态
网络服务模型network service model:定义网络的一侧边缘到另一侧边缘之间即发送端系统和接收端系统之间的汾组的端到端运输特性。
网络层能够提供给发送主机的运输层的服务:
确保交付:确保分组将最终到达其目的地
具有时延上限的确保交付:确保分组在特定的主机到主机时延上界内交付。
能够为给定的源和目的地之间提供给分组的流的服务:
有序分组交付:确保分组以被發送的顺序到达目的地
确保最小带宽:只要发送主机以低于某特定比特率的速度传输比特,分组就会按时交付
确保最大时延抖动Guaranteed maximum jitter:确保发送方发送两个相继分组之间的时间量等于在目的地接受到它们之间的时间量或这个时间间隔不超过一个固定的值。
安全性服务:使用僅仅源和目的主机知晓的秘密会话密钥源主机的网络层能够加密向目的主机发送的所有ipv6数据报首部长度报负载。目的主机的网络层则负責解密该负载
因特网的网络层提供单一的网络服务,称为尽力而为服务best-effort service分组间的定时得不到保障,分组接收的顺序也无法保证按序傳送的分组也不能保证交付。
除了因特网中的尽力而为服务模型在ATM网络体系结构中,有恒定比特率和可用比特率两种服务:
恒定比特率Constant Bit Rate CBR ATM網路服务:适用于承载实时、恒定比特率的音频和视频流量
可变比特率Available Bit Rate ABR ATM网络服务,也许最好服务稍微比尽力而为好一点的服务ABR可能会丟失信元,但信元不能重排序即有序最小信元传输速率MCR是可以得到保证的,且有拥塞指示


网络层与运输层类似,也有无连接服务和有連接服务网络层与运输层在面向连接方面的重要差异:1.在网络层,这些服务是提供给运输层的主机到主机的服务而在运输层,这些服務是提供给应用层的进程到进程的服务2.计算机网络体系结构中,在网络层只提供其中一种服务提供连接服务的网络称为虚电路Virtual-Circuit网络,提供无连接服务的计算机网络称为ipv6数据报首部长度报网络datagram network3.在运输层实现的面向连接的服务建立的连接是两个端系统之间的连接,而在网絡层实现的连接除了端系统外也在位于网络核心的路由器中实现。

虚电路网络:因特网是ipv6数据报首部长度报网络而其他网络体系结构ATM囷帧中继都是虚电路网络。


一条虚电路的组成:1.源和目的地之间的路径即一系列链路和路由器。2.VC号沿着该路径的每段链路的一个号码 。3.沿着该路径的每个路由器中的转发表表项
属于一条虚电路的分组必须在其首部携带一个VC号,因为一条虚电路在每条链路上的VC号可能不哃则经过路由时,使用一个新的VC号来替代分组中的VC号该VC号由转发表中获取。则当跨越一个路由器建立一个虚电路时转发表中就增加叻一个新项,而虚电路终止时就删除沿着该路径的每个路由器中的转发表中的相应项。
对于虚电路中每条链路保持不同VC号的原因:逐链蕗代替该号码可以减少分组首部VC字段的长度;通过使虚电路的每条链路有不同的VC号简化了虚电路的建立。
在虚电路中路由器必须为进荇中的连接维持连接状态信息connection state information。而这里作为连接项一同在创建时加入转发表中存储
虚电路中的3个阶段:1.虚电路建立:运输层与网络层联系,指定接收方地址等待网络建立虚电路。网络层决定路径确定链路的VC号,在每台路由器的转发表中增加一项还可以预留虚电路路徑上的资源如带宽。2.ipv6数据报首部长度传输:分组沿着虚电路流动3.虚电路拆除:当接收方或发送方通知网络层终止该虚电路时,通知另一端并更新每台路由器中的转发表。
端系统向网络发送指示虚电路启动及终止的报文以及路由器之间传递的用于建立虚电路的报文称为 信令报文signaling message。用来交换这些报文的协议称为信令协议signaling protocol

ipv6数据报首部长度报网络:在ipv6数据报首部长度报网络中,每个端系统要发送分组时它為分组加上目的地端系统的地址,然后将分组推入网络中在网络中,每个路由器都使用该分组的目的地址来转发该分组每台路由器都囿一个将目的地址映射到链接接口的转发表,然后根据地址查找输出链路接口进行转发。


转发表中是以目的地址范围来设置对应的链路接口而转发表中目的地址的范围是一种前缀匹配的形式,即转发表中存储的是一定地址的前缀然后使用目的地址与这些前缀进行匹配,当匹配时就使用此项所对应的链接接口转发分组。路由器中还是使用最长前缀匹配规则longest prefix matching rule当多个匹配时,寻找转发表中最长的匹配项并用其链路接口转发分组。如转发表中有一项为01000 链路接口为0另一项为00 链路接口为1,还有一项为  “其他”链路接口为2,则当地址为00 时使用链路接口1转发分组。
在ipv6数据报首部长度报网络中转发表由选路算法修改,通常每1-5分钟更新一次转发表

虚电路的概念来源于电路茭换网络,电路交换网络比分组交换网路要复杂许多因为电话网络要连接的是一些低端的设备,这些设备所能做到的几乎只有接收和发送ipv6数据报首部长度所以大多数工作要在网络层实现。而分组交换网络面向的是计算机这样的端系统而这样的端系统可以在更高层实现佷多功能,也就减轻了网络层的工作:提供最少的服务保证的因特网服务模型使得互联使用各种链路层技术的网络变得更加容易;新的協议都可以在位于网络边缘的端系统计算机上实现。


一个路由器由4个组成部分:
输入端口input ports:执行将一条输入物理链路接到路由器的物理层功能也要执行与 位于链路远端的链路层功能 交互的链路层功能,它还要完成查找和转发功能以便转发到路由器交换结构部分的分组能絀现在适当的输出端口。控制分组(如携带了选路协议信息的分组)从输入端口转发到选路处理器在路由器中多个端口经常被集中到路甴器中的一块线路卡line card上。
交换接口switching fabric:将路由器的输入接口连接到它的输出端口交换结构完全包容contained在路由器中,即它是路由器中的网络
輸出端口:储存经交换结构转发给它的分组,并将这些分组传输给输出链路则输出端口执行的是与输入端口顺序相反的功能,先链路层再物理层。当一条链路是双向时与链路相连的输出窗口和输入窗口在同一线路卡上出现。
选路处理器routing processor:执行选路协议维护选路信息囷转发表,并执行路由器中的网络管理功能

输入端口:在路由器中,是在输入端口来查找转发表确定转发的输出端口转发表在被选路處理器处理的同时被拷贝到每个输入端口中,并会被更新所以分组可以直接在输入端口做出转发决策,而无需调用中央选路处理器这種分散式的decentralized转发效率更高。当使用一个工作站或服务器用作一个路由器时其输入输出端口为其网络接口卡,其选路处理器为其CPU但其输叺端口无法进行选路操作,便将分组直接发给中央选路处理器然后有处理器来执行转发查找并进行转发。路由器查找速度要足够快处悝速度应该达到 线路速度line speed,即执行一次查找的时间应小于输入端口接收一个分组所需的时间将转发表表项存放在一个树形结构中,树的烸一级与目标地址中的一比特相对应0为左子树,1为右子树查找地址时,从根节点开始进行2分查找。但这样选路还是不够快因为每佽查找都要访问一次内存。所以应该使用更加高速的算法


内容可寻址内存Content Addressable Momery CAM,允许一个32比特IP地址提交给CAM由它来返回该地址对应的转发表表项内容。
一旦查找到分组的输出端口就将该分组转发进交换结构。分组进入交换结构时由于其他分组当前正在使用该交换结构,而被暂时阻塞则将阻塞分组在输入端口处排队,等待调度

交换结构:交换结构有三种交换的技术: memory:最早最简单的路由器就是计算机,則其输入端口和输出端口都在CPU的直接控制下完成CPU将到达的分组拷贝到处理器内存上,然后取出目的地址在转发表中找出适当的输出端ロ,将分组拷贝到输出端口的缓存中这里若内存带宽为每秒可写进或读出B个分组,则总的转发吞吐量必然小于B/2除以2是因为从输入端口讀到CPU再从CPU复制到输出端口这两个操作不是同步的,小于是因为计算耗时 许多现代路由器也使用内存交换,但与计算机路由器不同目的哋址的查找和将分组储存进适当的位置由输入线路卡上的处理器来执行的。
2.经一个总线bus交换:输入端口经一根共享总线将分组直接传送到輸出端口不需要选路处理器的干预。经内存交换分组进出内存也是会跨越系统总线的这里每个分组要跨越单一总线,交换带宽受总线速率限制
3.经一个互联网络交换:克服总线带宽限制的一个方法就是使用复杂的互联网络。一个纵横式crossbar交换机就是一个由2n条总线组成的互联网络,它将n个输入端口与n个输出端口连接分组沿着连接到输入端口的水平总线穿行,直至水平总线与连到所希望的输出端口的垂直總线的交叉点如果被阻塞,则返回输入端口排队

排队:路由器中队列增加,导致缓存空间被耗尽就会出现丢包。分组丢失的位置(輸入端口或输出端口)取决于 流量负载traffic load交换结构的相对速率和线路速率等几个因素。交换结构速率为交换结构从输入端口到输出端口移動分组的速率则当交换结构的速率至少为输入线路的速率的n倍时,则在输入端口处不会出现排队n为输入端口的数,即所有端口都在以朂大速率接收分组但交换结构仍能够将所有输入进行传输。而输入端口排队的情况为交换结构速率小于可能的输入速率但输出端口并鈈相同,当交换结构速率大于输出链路速率时就可能需要排队,因为这些流量可能想要前往相同的输出链路


路由器中的缓存长度计算嘚经验方法:缓存量B 等于 平均往返时延RTT 乘以链路容量C。这是相对少量的TCP流的情况对于大量TCP流(N)经过一条链路时,缓存量为B = RTT * C / √N
输出端ロ的排队,输出端口的一个分组调度程序packet scheduler 必须在这些排队的分组中选出一个来传送而选择的策略有多种:先来先服务FCFS调度,加权公平排隊WFQWFQ规则是在具有排队等待传输的分组的不同端到端连接之间公平的共享输出链路。
输入端口排队过多则丢弃到达的分组,即弃尾drop-tail或鍺删除一个或多个已排队的分组。在某些情况下缓存填满前就丢弃,以便向发送方提供一个拥塞信号这些策略称为主动队列管理AQM算法。随机早期检测Random Early Detection RED算法是一种广泛使用的AQM算法:为输出队列长度维护一个加权平均值如果平均队列长度小于最小阈值min,则当一个分组到达時被接纳如队列。相反如果队列已满或超过最大阈值max,则标记分组或丢弃如果平均队列长度在 (min ,max)中则该分组以某种概率标记戓丢弃。
然而当输入队列前端的两个分组是发往同一输出队列时则其中一个分组被阻塞,必须在输入队列中等待因为交换结构一次只能传送一个分组到指定的一个输出端口中。之前考虑的是一段时间内而这里是说在一个瞬间,不能有两个分组被交换结构同时传给一个輸出端口
线路前端head-of-the-line HOL阻塞:当在一个时刻,位于输入队列前端的两个分组发往同一个输出端口则其中一个分组必须等待,而等待分组之後的分组即使与另一个分组无竞争关系但被其队列前端分组阻塞而无法传输。
目前有两个版本的IP正在使用IP协议版本4, IPv4,IP协议版本6IPV6。因特网的网络层有三个主要部分:IP协议选路组件:决定ipv6数据报首部长度报从源到目的地所流经的路径,由转发表和选路协议构成报告ipv6数據报首部长度报中差错和对某些网络层信息请求进行响应的设施。因特网的网络层差错和信息报告协议即互联网控制报文协议ICMP。

ipv6数据报艏部长度报的格式:考虑IPv4的ipv6数据报首部长度报datagram的格式ipv6数据报首部长度报中也是使用32个比特作为一个字。则依次存储的ipv6数据报首部长度为:


版本号:4个比特的版本号这里使用的是IPv4。
首部长度:一个IPv4的ipv6数据报首部长度报中首部可包含一些可选项所以需要使用4个比特来记录艏部的长度。但大多数ipv6数据报首部长度报不包含可选项一般有20字节的首部长度。但是显然这里4个比特应该储存的是首部的字的数目
服務类型:服务类型TOS 占8个比特,用来区别不同类型的ipv6数据报首部长度报如实时ipv6数据报首部长度报与非实时流量(如FTP)区分开来。
ipv6数据报首蔀长度报长度:字段长度为16比特储存IPipv6数据报首部长度报的总长度,首部加ipv6数据报首部长度以字节记,则最大为65535字节但ipv6数据报首部长喥报一般很少超过1500字节,
寿命 Time-to-live TTL:8个比特的寿命字段用来确保ipv6数据报首部长度报不会永远在网络中循环。每当ipv6数据报首部长度报经过一个蕗由器就将该字段减1,如果TTL字段减为0则丢弃该ipv6数据报首部长度报。
协议:这里的8个比特存储的是上层即运输层的协议指明ipv6数据报首蔀长度报的ipv6数据报首部长度部分应交付给哪个运输层协议。这里使用协议号将网络层与运输层绑在一起如同运输层报文段中的端口号将運输层与应用层绑在一起一样。
首部检验和:16个比特的首部检验和如ipv6数据报首部长度报中的首部检验和一样进行计算得到。路由器对每個收到的ipv6数据报首部长度报计算其首部检验和进行检测,如果出错则一般会丢弃此错误ipv6数据报首部长度报。注意路由器还必须在TTL字段改变后,重新计算检验和并放在原处这里是首部检验和,即IP只对自己的首部进行检验和计算而TCP中是对整个报文段进行检验。其次TCP/UDP与IP並不一定在同一个协议栈TCP可以运行在不同的协议上,如ATM而IP也能狗携带传递给其他运输层协议的ipv6数据报首部长度。
源和目的IP地址:各32比特当源主机产生一个ipv6数据报首部长度报时,它在源IP字段插入IP地址在目的IP地址字段插入其最终目的地的IP地址。通常源主机通过DNS来查找目嘚地址
选项options:选项字段允许IP首部被扩展。首部的存在使ipv6数据报首部长度报头部长度可变无法预先确定ipv6数据报首部长度字段从何处开始,且选项增加的处理选项会导致路由器速率降低选项的存在使路由器效率不高,所以在IPv6中不采用IP选项
ipv6数据报首部长度 (有效载荷payloda):IPipv6数据報首部长度报中ipv6数据报首部长度字段一般含有要交付给目的地的运输层报文段(TCP或UDP),也可以承载其他类型的ipv6数据报首部长度如ICMP报文段。

ipv6数据报首部长度报分片:以太网帧可承载不超过1500字节的ipv6数据报首部长度一个链路层帧可承载的最大ipv6数据报首部长度量叫做最大传输单え MTU。链路层协议MTU严格限制着IPipv6数据报首部长度报的长度而发送方到目的地路径上的每条链路可能使用不同的链路层协议,而每种协议可能具有不同的MTU则需要进行分片,即将IPipv6数据报首部长度报中的ipv6数据报首部长度分片成两个或更多个较小的ipv6数据报首部长度报用单独的链路層帧来封装这些较小的IPipv6数据报首部长度报,然后向输出链路上发送这些帧。这些较小的ipv6数据报首部长度报称为片 fragmentIPv4的设计者认为,片在路由器间传递时如果再进行重新组装,这会严重影响路由器的性能为坚持使网络内核保持简单的原则,将ipv6数据报首部长度报的重新组装工莋放在端系统中端系统从相同源收到一些列ipv6数据报首部长度报时,要确定这些ipv6数据报首部长度报中某些是否是原来较大的ipv6数据报首部长喥报的片如果确定这些ipv6数据报首部长度是片,它进一步确认何时收到最后一片以及如何将这些片拼接成初始ipv6数据报首部长度报。


为了讓目的主机执行这些重新组装任务使用IPipv6数据报首部长度报中的 标识 ,标志 和 片位移 字段来记录相关信息当源主机创建一个ipv6数据报首部長度报时,为其加上源地址目的地址和标识号,每一个新的ipv6数据报首部长度报的标识号加1当路由器将ipv6数据报首部长度报分片时,为每個ipv6数据报首部长度报附加上初始ipv6数据报首部长度的源地址、目的地址和标识号同时为最后一个片的标志比特设为0,其他片的标志比特为1并在偏移字段中指定片应放在初始ipv6数据报首部长度报中的位置。除了最后一片外所有的有效载荷的数量应是8字节的倍数而且偏移值offset value 以8芓节块 为单位。偏移值为有效载荷起始位置在ipv6数据报首部长度报中的位置
例:一个4000字节的ipv6数据报首部长度报,其首部为20字节有3980有效载荷,要由路由器转发到MTU为1500字节的链路上则分为3片,如果标识位为777则第一片长度为1500,有效载荷为1480标识为777,offset 为0flag 为 1 ; 第二片 长度仍为1500,標识为777offset 为185 (1480/8),flag为1;第三片 ipv6数据报首部长度报的有效载荷仅当完全重构为初始IPipv6数据报首部长度报时才能被传递给目的地运输层。如果發生片的丢失则丢弃不完整的ipv6数据报首部长度报。但如果运输层在使用TCPTCP将通过源重复ipv6数据报首部长度报中的ipv6数据报首部长度而恢复丢夨的片。但是我对书中这里表示不理解:TCP是端到端丢失的片可能在路由器中被分片,而且TCP发送操作的是报文段如何让发送方重发对应嘚丢失的片?而如果按照上章的内容应该是丢弃所有片,直接再次重传因为片不是ipv6数据报首部长度段,TCP只能重传自己的ipv6数据报首部长喥段或者这里有些细节书上未详细说明,不解
主机与物理链路之间的边界称为 接口interface。路由器与链路之间的边界也称为接口因为每台主机和路由器都能发送和接收IPipv6数据报首部长度报,所以IP要求每台主机和路由器接口都有自己的IP地址因此一个IP地址在技术上是与 一个接口楿关联的,而不是与包括该接口的主机或路由器相关联
每个IP地址长度为32比特4个字节,约40亿个IP地址每台主机和路由器上的每个接口都有┅个全球唯一的IP地址(在NAT后面的接口除外)。
一台路由器可以有多个接口而一台主机通常只有一个接口,一台路由器的一个接口可以与哆台主机的接口相连这种不包含路由器的网络 可以是一个以太LAN,通过以太网集线器或以太网链路层交换机互联在IP中,互联主机的接口與路由器的一个接口的网络 形成一个 子网subnetIP编码为这个子网分配一个地址如:223.1.1.0/24,其中/24的计法有时称为子网掩码subnet mask它表明地址32比特中左侧的24仳特定义了一个子网地址。因此所有在223.1.1.0/24的网络中的地址形式都为223.1.1.xxx
网络中,路由器与路由器之间的点到点链路也是一个子网将路由器连接到多个主机的广播链路broadcast link也是子网。
因特网的地址分配策略称为无类别域间选路Classless Interdomain Routing CIDR形式为a.b.c.d/x的地址中的x最高比特构成了IP地址的网络部分network portion,并苴经常被称为该地址的前缀prefix一个地址的剩余32-x比特可认为是用于区分组织内部设备的。当组织内部转发分组时才会考虑这些比特而该组織内部可能还能划分子网。
在采用CIDR之前IP地址的网络部分被限制长度为8,1624比特,而组成的子网分别被称为A、B和C类网络这种编址方案称為分类编址classful addressing。一个C类网络/24 最多容纳254台主机其中2个地址预留用于特殊用途。B类网络/16最多支持65534台主机由于这样分配对于小型和中规模的子網浪费大量地址,造成地址空间的低利用率
IP广播地址 255.255.255.255 ,当一台主机发出目的地址为这样的ipv6数据报首部长度报时该报文将交付给同一个孓网中的所有主机。

获得一块地址:一个子网管理员要想获取一块IP地址一般会与ISP联系,ISP会从自己分得的地址块中分配一个块给子网管理員或者向ICANN机构获取。ICANN不仅负责分配IP地址还管理DNS根服务器,还分配域名和解决域名争端


获得主机地址:对于路由器接口地址,系统管悝员手工配置路由器中的IP地址在远程通过网络管理工具进行配置。也可以手动配置主机但更常用的是动态主机配置协议Dynamic Host Configuration Protocol DHCP:利用DHCP主机可鉯自动的获取IP地址。网络管理员可以配置DHCP以便给定主机在每次与该网络连接时都得到一个相同的IP地址,或者分配一个临时的IP地址temporary IP address主机烸次连接的IP地址都可能不同。DHCP还允许一台主机获取其他信息如子网编码,它的第一跳路由器地址(称为默认网关default gateway)与它的本地DNS服务器的哋址DHCP具有主机连接进一个网络的自动化处理功能,所有又称为即插即用协议plug-and-play protocolDHCP是一个客户机/服务器协议,新到达的主机是客户机
对于┅台新到达的主机,DHCP执行以下4个步骤:1.DHCP服务器发现新到主机的首要任务是发现与其交互的DHCP服务器,主机发送DHCP发现报文DHCP discover message来完成客户机在UDP汾组中向端口67发送该报文,使用广播目的地址255.255.255.255使用0.0.0.0作为本主机的源地址。2.DHCP服务器提供 server offer:DHCP收到报文后用一个DHCP提供报文DHCP offer message 对客户机做出响应。仍然使用255.255.255.255广播地址作为目的地址提供报文中含有收到报文的事物ID、向客户机推荐的IP地址、网路掩码以及IP地址租用期IP address least 当客户机收到DHCP ACK后,茭互就完成了客户机就能够在租用期内使用分配到的IP地址。到客户机超过租用期时DHCP提供一种允许客户机更新租用期的机制。

NAT:简单来說就是平时使用的路由器的实现。路由器从DHCP获得一个IP地址做为路由器的地址而路由器又为多个家庭用户设备提供地址,以便多个设备能够同时与网络连接这里家庭用户的地址使用的是虚拟地址在地址空间10.0.0.0/8这个RFC中保留的IP地址中,这些地址用于专用于网络或具有专用地址嘚地域realm具有专用地址的地域是指其地址仅对该网络中的设备有意义的网络。则许多家庭网络中使用这些相同的地址空间NAT路由器对外界嘚行为就认同一个具有单一IP地址的单一设备,所有离开家庭路由器通向更大的因特网的报文都采用同一个源IP地址即路由器的地址且所有進入家庭网络的报文都用于同一个目的IP地址。NAT使路由器对外界隐藏了家庭网络的细节


路由器的IP地址由ISP的DHCP服务器获得,而其自己也运行一個DHCP服务器来为家庭网络中的计算机分配具有专有地址的地域中的地址路由器同过NAT转换表Nat translation table 来确定发向路由器的ipv6数据报首部长度报转发给哪個内部主机。转发表中包含端口号和IP地址当家庭网络中主机发送ipv6数据报首部长度报到LAN中时,NAT为该ipv6数据报首部长度报生成一个新的且当前為在NAT转换表中使用的源端口号并更改,同时将源IP地址修改为其广域网一侧WAN-side 接口的IP地址并为转换表添加新项。而当广域网传来ipv6数据报首蔀长度报时NAT再根据转发表中的表项 改写ipv6数据报首部长度报的目的IP和目的端口号,并向家庭网络转发该ipv6数据报首部长度报
NAT妨碍P2P应用程序。如果对等方B位于NAT后则就不能充当服务器并接收TCP连接。因为很简单A给B发送的报文,其端口号为正确的端口号但是在NAT转换表中找不到戓会出错,所以无法无法直接充当服务器解决方法是让在NAT后的B先去与中间对等方C建立TCP连接,C不在NAT后且作为服务器然后A再经C请求B,建立TCP連接后双方就可以交换报文和文件了称为NAT穿越NAT traversal。如果双方都在NAT后面则需要使用应用程序来中继处理。

互联网控制报文协议 Internet Control Message Protocol ICMP:用于主机囷路由器彼此交换网络层信息ICMP在IP的上层,报文承载在IPipv6数据报首部长度报中ICMP报文有一个类型字段和一个编码字段,并且包含该ICMP报文首次苼成的IPipv6数据报首部长度报的首部和前8个字节内容 ping程序发送一个ICMP类型8编码0的报文到指定主机,接收到的主机发回一个类型0编码0的报文的ICMP回顯回答ICMP也可以发送源抑制报文,即拥塞时强制主机减小发送速率Trancerout通过发送UDP报文,并接收路由返回的ICMP报文来判断路径中的路由器以及路甴器的信息和时延

IPv6:开发IPv6的最初动机是因为32比特的地址空间即将用尽。主要变化:扩大的地址容量:将IP地址长度由32比特增加到128比特这確保全世界不会用尽IP地址。除了单播和多播地址外还引入了一种称为任播地址anycase address的新型地址,是ipv6数据报首部长度报交付给主机中的任意一個简单高效的40字节首部:新的选项编码允许进行更灵活的选项处理。流标签和优先级Flow labeling and priority:IPv6中的流确切定义还未完全确定其优先级同时也表明流的类型不同。


IPv6中ipv6数据报首部长度报的字段:版本号:4比特为6。流量类型:8比特流标签:20比特,用来标识一个ipv6数据报首部长度报嘚流有效载荷长度:16比特。下一个首部next header:使用与IPv6中协议字段相同的值指示的是要交付给哪个运输层协议。跳限制Hop linmit:这里一跳就是经过┅个路由器到达0则丢弃ipv6数据报首部长度报。源和目的地址:256比特ipv6数据报首部长度:有效载荷。
IPv6中没有片偏移位和标志位不允许在中間路由器上进行分组和重新组装,这些操作只能在源和目的地上执行当一台路由器收到IPv6ipv6数据报首部长度报应太大而不能转发到出链路上時,则丢弃ipv6数据报首部长度报并向发送方返回一个分组太大的ICMP差错报文。然后发送方使用较小长度的IPipv6数据报首部长度报重发ipv6数据报首部長度大大加快了网络中的IP转发速度。
首部检验和:因为运输层和链路层协议执行了检验操作则在网络层省略了这种操作。提高速率
選项:选项字段不再是标准IP的首部中的一部分。TCP或UDP的协议首部可出现在IP分组的下一个首部字段指出一样选项字段也可在下一个首部字段Φ指出。而删除选项字段导致一个定长40字节的IP首部
IPv4如何升级到IPv6,这是一个很麻烦的事情暂时使用双栈dual-stack的方法,即IPv6的节点也具有完整的IPv4功能当IPv6与IPv4节点相互操作时,使用IPv4,两个IPv6节点使用IPv6.
另一种双栈的方法是建隧道tunneling,即两个IPv6节点间由中间IPv4路由器互联则将两个IPv6节点间IPv4路由器的集匼称为隧道tunnel,则当IPv6使能-capable节点想IPv4节点转发ipv6数据报首部长度报时要将原来的IPv6的ipv6数据报首部长度报封装在IPv4中,而后在IPv6节点间转发时在解封出來。

IP安全性:IPsec为流行的安全网络层协议也是虚拟专用网VPN中广泛采用的协议。运输层传递报文段时进行加密和解密使用的是对称加密算法。IPv4和IPv6没有进行加密几乎没有安全性。


ipv6数据报首部长度报服务中在给定源和目的地间传输不同的分组可能采用不同的路由,因为有选蕗算法的存在当其更新了路由中的转发表就可能导致分组经不同的路由转发,而虚电路在一开始就使用选路算法将所有路径固定了所鉯分组传输采用相同的路径。
直接与主机相连的路由器称为该主机的 默认路由器default router又称第一条路由器first-hop router。称源主机的默认路由器为源路由器source router同理目的主机的默认路由器称为目的路由器destination router。则研究的选路问题为从源路由器到目的路由器的选路问题而一般的选路的目的是选取一條好的路径,即具有最低费用的路径
图论graph被用于形式化选路问题。这里的图是无向图选路就是在选 最低费用路径 least-cost path,费用可以是链路的粅理长度链路速度或该链路的金融上的费用。令c(x,y)为两个节点间的费用当节点对不属于网络E时,c(x,y)= ∞如果边(x,y)属于E,则xy互为邻居neightbor
选路算法可以根据是全局性还是分布式分为:
全局选路算法global routing algorthm:用完整的全局性的网络信息来计算源到目的地之间的最低费用。该算法以所有节点の间的连通性connectivity和所有链路的费用costs作为输入计算可以在某个场点(集中式centrailized全局选路算法)运行,也可以在多个场点冗余地进行这样具有铨局状态信息的算法被称为 链路状态Link-State LS算法。
分布式选路算法decentrailized routing algorithm:以迭代分布式的方式计算出最低费用路径每个节点仅有与其直接相连的链蕗的费用信息即可开始工作。通过迭代计算过程并与相邻neighboring节点交换信息一个节点逐渐计算出到达目的节点或一组目的节点的最低费用。距离向量Distance-Vector DV算法每个节点维护到网络中所有其他节点的费用估计的向量。
选路算法还可以根据算法是静态还是动态来进行分类在静态选蕗static routing算法中,路由的变换非常缓慢通常由人工干预进行调整 ,如手工编辑路由器的转发表动态dynamic选路算法:在网络流量负载或拓扑topology发生变囮时改变选路路径。动态算法周期性的运行或直接响应拓扑或链路费用的变化而进行
选路算法还可以根据其负载敏感还是负载迟钝进行汾类:负载敏感load-sentitive 算法,链路费用会动态的反应底层链路的当前拥塞水平当前选路算法都是负载迟钝的,链路费用不能明显的反应当前拥塞水平

链路状态选路算法:网路拓扑和所有链路费用都是已知的。通过让每个节点路由器想网路中的所有其他路由器广播链路状态分组 來实现其中每个链路状态分组包含路由器所连接的链路的特征和费用。由链路状态广播link state broadcast算法来实现


使用Dijkstra算法来计算最低费用路径。Dijkstra算法是图论中计算最短路径的算法是一种迭代算法,迭代k次可知道网络中k个节点时最低费用路径。这里记: D(v):随着算法进行本次迭代從源节点到目的节点v的最低费用路径的费用。p(v)为从源节点到目的节点v沿着当前最低费用路径的前一节点(v的邻居)N'为节点子集,每次迭玳就增加一个节点进入节点子集而当节点v加入N’中时,最低费用路径已确定
该全局选路算法由一个初始化步骤,和之后的循环构成循环的次数与网络中的节点数量相同。这里就是ipv6数据报首部长度结构中的Dijkstra算法不过分详细说明。然后初始化阶段加入源节点则与源节點相连的节点的费用就是费用而不相连的为∞,而其前一个节点p(v)都为源节点然后迭代时,观察寻找未加入集合N‘中的最低费用节点将其加入N’。再更新所有的D(v)当新加入的节点时源节点到目的节点费用更低时,更新Dv和P(v)重复迭代。则最后我们可以得到每个节点箌源节点的最低费用路径的前一个节点依次选取就可获得完整的从源节点到所有目的节点的最短路径的路径。而通过为 节点存放 其他节點为源节点到它的最低费用路径上的前一个节点  则可以为这个节点构建转发表。最坏情况复杂度为O(n^2)

距离向量算法:距离向量算法是迭代嘚iterative异步的asynchronous和分布式的dirtributed。Bellman-Ford方程:d x(y) = min v{c(x,v)+d v(y)};即x到y 的最低费用为 与x相连的所有节点中 到x的链路费用与到y节点最低费用之和的最小值而这个节点即为x节點要转发分组的下一跳 。同时该方程提出了DV算法中发生邻居到邻居通信的形式:其基本思想是:每个节点x以Dx(y)开始对N中所有节点估计の间费用。令 Dx = [Dx(y):y∈N]为节点x的距离向量distance vector向量里保存所有x到N中节点的费用估计。采用DV算法每个节点要维护以下ipv6数据报首部长度:到邻居嘚直接费用c(x,v);节点的距离向量;所有邻居节点的距离向量。在这个分布式的异步算法中每个节点不时的向它的每个邻居发送距离向量拷贝。而当节点接收到距离向量时还会使用方程更新自己的距离向量。如果一个节点的距离向量因为这个更新步骤而改变则该节点要想它所有的邻居发送更新后的向量。


而在DV算法中节点需要知道的不是x到y的最短路径距离,而是邻居节点的最短路径距离而节点选择其最短蕗径的邻居节点作为下一跳路由器,节点据此来更新到目的地y的转发表选路表中routing table每一行就是一个向量,而初始时未知道其他路由器的凊况,所以费用为无穷大然后每个向量互相发送自己的向量,并接收计算再发送。。直到无更新进入静止状态
链路费用变化与链蕗故障:当运行DV算法的节点检测到从它到邻居的链路费用发生改变时,就更新距离向量如果最低费用路径的费用也发生改变,则向邻居通知其更新后的距离向量当某节点未正确接收到距离向量的更新,导致类似一下情况:在xy,z三个路由器组成的网络中x没有获得正确哽新的y到z的距离向量,而认为x到y到z的路径是最短的便将分组转发给了y,并将计算得到的新的距离向量转发给y而路由器y接收到x发过来的基于错误产生的错误的距离向量,却以此来更新自己距离向量中的正确部分给更新了即y认为x找到了一条更短的路径,判断是y到x到z路径是朂短的又将分组传回给了x,同时更新自己的正确的距离向量并将新的得到的错误距离向量重新发给x,然后循环遇到了选路环路routing loop。而烸次来回传的过程中距离会增加这段链路的费用直到两者之间错误的距离向量来回更新到打破循环就会退出循环。
增加毒性逆转poison reverse:即z通過y选路到达目的地x时z将通知y,z到x的距离是无穷大的只要z经y选路到x,它就会持续这个状态但设计到3个或更多个节点的环路将不能被毒性逆转技术检测到。

LS与DV选路算法的比较:报文复杂度:LS算法中发送的报文更多而且无论何时一条链路的费用改变,都必须想所有节点发送新的链路信息收敛速度:DV算法收敛较慢,遇到环路还会遭到计数到无限的问题健壮性:一台路由器发生了故障,LS节点仅计算自己的轉发表路由器在某种程度上是分离的,而DV算法下一个小的故障将导致大量的错误。

层次选路:规模随着路由器数量变得很大,选路信息的计算储存即通信的开销变得极大LS中广播传输的开销将使占据大量的带宽,而DV算法的迭代也将永远无法收敛管理自治,一个组织想要能够按自己的意愿进行和管理其网络还能将其网络与外部网络连接。


这两个问题通过将路由器组织进自治系统Autonomou System AS中解决每个AS由一组通常在相同管理控制下的路由器组成。在相同的AS内的路由器全部运行相同的选路算法而内部的选路协议称为自治系统内部选路协议,且擁有彼此之间的信息在AS内有一台或多台路由器负责向本AS外的目的转发分组,这些路由器称为网关路由器gateway routing选路AS尽可能快(尽可能低费用)的摆脱分组。通过让路由器向某网关路由器发送分组来完成同时同时要求该网关路由器到目的地路径上的所有网关路由器具有最低费鼡。即路由器选择网关后迅速发送分组并决定使用此网关路由器,然后选定最低费用路径对其转发表增加用于x的表项所采取的动作。ISPΦ包含一个或多个ASAS内部的路由器只需要知道本AS内的路由器。
RIP:是一种距离向量协议使用跳数作为其费用测度,即每条链路的费用都为1跳是沿着路由器到目的子网包括目的子网 的最短路径所经历的子网数量。一条路径的最大费用被限制为15RIP被限制在网络直径不超过15跳的洎治系统内。在RIP中选路更新信息在邻居之间通过RIP响应报文 交换,大约30秒交换一次,每台路由器维护一个叫选路表的RIP表其中放着路由器的距离向量和转发表。
OSPF:使用洪泛链路状态信息的链路状态协议和一个Dijkstra最低费用路径算法使用OSPF,一台路由器构建一副关于整个自治系统的唍整拓扑图各条链路费用有管理员配置,且周期性地向相邻路由器广播以确保健壮OSPF的优点:安全,多条相同费用路径对单播选路与哆播选路的综合支持,支持在单个选路域内的层次结构在AS内的一个区域内,有一台或多台区域边界路由器负责发送到区域外的分组选蕗。一个AS中有一个区域会被配置称主干backbone主干区域为AS内其他区域之间的流量选路,主干包含AS内所有区域边界路由器路由器分为内部路由器,区域边界路由器主干路由器,和边界路由器
广播选路:网络层提供从一个源节点到网络中的所有节点交付分组的服务。多播选路:每一个源节点能够向其他网络节点的一个子集发送分组的拷贝
广播选路算法:最简单的是N次单播,但是其效率低 洪泛flooding:该方法要求節点在收到广播分组后向他所有邻居(除了接收分组的那个邻居)发送该分组的拷贝。其缺点是致命的如果图中有圈,即广播分组会在網络中无限循环在这种情况下还有一个更加致命缺陷,当一个节点与多个节点相连时会产生并转发多个拷贝,导致广播风暴受控洪泛:通过一些限制使节点明智的选择何时洪泛分组。有多种方法进行限制:序号控制:源节点将地址以及广播序号放入分组其他节点会賦值泽泻信息放在一个列表中并维护,然后每次检查分组是否已在列表中反向路径转发RPF:基本思路是,一台路由器收到具有给定源地址嘚广播分组后仅当该分组到达的链路正好位于它自己到其源的最短单播路径上,它才向其所有出链路传输分组原理就是任何一节点都呮有唯一的一条最短单播路径,所以每个节点注定只会传播到一次生成树广播:将图转换为最小生成树,根据最小生成数来确定传播
哆播multicast:多播ipv6数据报首部长度报使用间接地址来编址,用一个标识来表示一组接收方这个标识为D类多播地址。互联网组管理协议IGMP:运行在┅台主机于第一条路由器之间为主机提供手段用于组的管理。多播选路算法:使用一个基于源的数进行多播选路通过剪枝来实现删去鈈想要的多播分组。因特网中使用的多播协议是协议网关的多播选路协议PIM
}

TCP/IP详解学习笔记(11)-TCP交互ipv6数据报首部长喥流成块ipv6数据报首部长度流

为什么会有TCP/IP协议

在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务这些电脑在表达同┅种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音让他们无法合作一样。计算机使用者意识到计算机呮是单兵作战并不会发挥太大的作用。只有把它们联合起来电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到叻一起

但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面完全不能交流信息。因而他们需要定义一些共通的东覀来进行交流TCP/IP就是为此而生。TCP/IP不是一个协议而是一个协议族的统称。里面包括了IP协议IMCP协议,TCP协议以及我们更加熟悉的httpftppop3协议等等。电脑有了这些就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了

提到协议分层,我们很容易联想到ISO-OSI的七层协议經典架构但是TCP/IP协议族的结构则稍有不同。如图所示

TCP/IP协议族按照层次由上到下层层包装。最上面的就是应用层了这里面有httpftp,等等我们熟悉的协议而第二层则是传输层,著名的TCPUDP协议就在这个层次(不要告诉我你没用过udp玩星际)第三层是网络层,IP协议就在这里它负責对ipv6数据报首部长度加上IP地址和其他的ipv6数据报首部长度(后面会讲到)以确定传输的目标。第四层是叫ipv6数据报首部长度链路层这个层次為待传送的ipv6数据报首部长度加入一个以太网协议头,并进行CRC编码为最后的ipv6数据报首部长度传输做准备。再往下则是硬件层次了负责网絡的传输,这个层次的定义包括网线的制式网卡的定义等等(这些我们就不用关心了,我们也不做网卡)所以有些书并不把这个层次放在tcp/ip协议族里面,因为它几乎和tcp/ip协议的编写者没有任何的关系发送协议的主机从上自下将ipv6数据报首部长度按照协议封装,而接收ipv6数据报艏部长度的主机则按照协议从得到的ipv6数据报首部长度包解开最后拿到需要的ipv6数据报首部长度。这种结构非常有栈的味道所以某些文章吔把tcp/ip协议族称为tcp/ip协议栈。

在学习协议之前我们应该具备一些基本知识。

互联网地址(ip地址)

网络上每一个节点都必须有一个独立的Internet地址(也叫做IP地址)现在,通常使用的IP地址是一个32bit的数字也就是我们常说的IPv4标准,这32bit的数字分成四组也就是常见的,就可以观察到一些 丢包嘚现象而程序运行的时间也会更加的长。
ping
还给我们一个看主机到目的主机的路由的机会这是因为,ICMPping请求ipv6数据报首部长度报在每经过┅个路由器的时候路由器都会把自己的ip放到该数 据报中。而目的主机则会把这个ip列表复制到回应icmpipv6数据报首部长度包中发回给主机但是,无论如何ip头所能纪录的路由列表是非常的有限。如果要观察路由 我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫做tracert)

.cn。峩们还可以把这个二级域名给划分成更小的区域比如说

DNS系统是一个分布式的ipv6数据报首部长度库当一个ipv6数据报首部长度库发现自己并沒有某查询所需要的ipv6数据报首部长度的时候,它将把查询转发出去而转发的目的地通常是根服务器,根服 务器从上至下层层转发查询矗到找到目标为止。DNS还有一个特点就是使用高速缓存DNS把查询过的ipv6数据报首部长度缓存在某处,以便于下次查询时使用

DNS报文定义了一个既可以查询也可以响应的报文格式。具体格式可以看P145页对各个字段简单解释如下

紧接着的16bit又可以做进一步的细分,标示了报文的性质囷一些细节比如说是查询报文还是响应报文,需要递归查询与否(一般服务器都支持递归查询而且不需要任何设置,BIND就是这样)

查询問题后面有查询类型包括ANSCNAMEPTRHINFOMX如果熟悉BIND的话,就知道在zong的配置文件里面每一条记录都记载了各自的类型,比如A就是IP地址NS就昰名字服务器。

响应报文可以回复多个IP也就是说,域名可以和多个IP地址对应并且有很多CNAME

正向查询指的是通过域名得到IP的查询而反姠查询就是通过IP得到域名。例如用host命令host

稍微知道一点ipv6数据报首部长度结构的人都能意识到,在正向查询的域里面做反向查询其做法只囿遍历整个ipv6数据报首部长度集合----对于DNS来说,那就是遍历整个ipv6数据报首部长度库 这将带来巨大的负担,所以DNS采取了另一种方法使用另一棵子树来维护IP-〉域名的对应表。这个子树的根节点是in-addr.arpa,而一个IP 2.11.168.192.in-addr.arpaip倒置)在DNS系统里面,一个反向地址对应一个PTR纪录(对应A纪录)所以反向查询又叫 做指针(PTR)查询。

BIND9默认是作为一个高速缓存服务器其将所有的查询都转交到根服务器去,然后得到结果并放在本地的缓冲区以加赽查询速度。如果有兴趣可以安装一个BIND9来尝试一下而自己定义的zone则可以规定其在缓存中的时间,一般是1天(就是配置文件中的1D

DNS服务器支持TCPUDP两种协议的查询方式,而且端口都是53而大多数的查询都是UDP查询的,一般需要TCP查询的有两种情况:

当查询ipv6数据报首部长度多大以臸于产生了ipv6数据报首部长度截断(TC标志为1)这时,需要利用TCP的分片能力来进行ipv6数据报首部长度传输(看TCP的相关章节)

当主(master)服务器和辅(slave)服务器之间通信,辅服务器要拿到主服务器的zone信息的时候

TCP是一个面向连接的协议,所以在连接双方发送ipv6数据报首部长度之前都需偠首先建立一条连接。这和前面讲到的协议完全不同前面讲的所有协议都只是发送ipv6数据报首部长度而已,大多数都不关心发送的ipv6数据报艏部长度是不是送到UDP尤其明显,从编程的角度来说UDP编程也要简单的多----UDP都不用考虑ipv6数据报首部长度分片。

书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程可以看到,TCP连接的建立可以简单的称为三次握手而连接的中止则可以叫做四次握手

在建立连接的时候客户端首先向服务器申请打开某一个端口(SYN段等于1TCP报文),然后服务器端发回一个ACK报文通知客户端请求报文收到客户端收到确认报文以后再佽发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此连接的建立完成。这就叫做三次握手如果打算让双方都做好准备嘚话,一定要发送三次报文而且只需要三次报文就可以了。

可以想见如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个ipv6数据报首蔀长度包被送到目的地

TCP有一个特别的概念叫做half-close,这个概念是说TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候必须关闭传和送两个方向上的连接。客户机给服务器一个FIN1TCP报文然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文当客戶机回复ACK报文后(四次握手),连接就结束了

在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS)以便通信。一般这个SYN长喥是MTU减去固定IP首部和TCP首部长度对于一个以太网,一般可以达到1460字节当然如果对于非本地的IP,这个MSS可能就只有536字节而且,如果中间的傳输网络的MSS更佳的小的话这个值还会变得更小。

4.TCP的状态迁移图

P182页给出了TCP的状态图这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移如果从某一个角度出发来看这个图,就会清晰许多这里面的服务器和客户端都不昰绝对的,发送ipv6数据报首部长度的就是客户端接受ipv6数据报首部长度的就是服务器。

4.1.客户端应用程序的状态迁移图

客户端的状态可以用如丅的流程来表示:

以上流程是在程序正常的情况下应该有的流程从书中的图中可以看到,在建立连接时当客户端收到SYN报文的ACK以后,客戶端就打开了ipv6数据报首部长度交互地连接而结束连接则通常是客户端主动结束的,客户端结束应用程序以后需要经历FIN_WAIT_1FIN_WAIT_2等状态这些狀态的迁移就是前面提到的结束连接的四次握手。

4.2.服务器的状态迁移图

服务器的状态可以用如下的流程来表示:

在建立连接的时候服务器端是在第三次握手之后才进入ipv6数据报首部长度交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)而关闭以後还要等待客户端给出最后的ACK包才能进入初始的状态。

书中的图还有一些其他的状态迁移这些状态迁移针对服务器和客户端两方面的总結如下

SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYNipv6数据报首部长度报则都需要发送SYNACKipv6数据报首部长度报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED

书中给的图里面有一个TIME_WAIT等待状态,这个状态又叫做2MSL状态说的是在TIME_WAIT2发送了最后一个ACKipv6数据报首部长度报以后,要进入TIME_WAIT状态这个狀态是防止最后一次握手的ipv6数据报首部长度报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)这个狀态在很大程度上保证了双方都可以正常结束,但是问题也来了。

由于插口的2MSL状态(插口是IP和端口对的意思socket),使得应用程序在2MSL时间內是无法再次使用同一个插口的对于客户程序还好一些,但是对于服务程序例如httpd,它总是要使用同一个端口来进行服务而在2MSL时间内,启动httpd就会出现错误(插口被使用)为了避免这个错误,服务器给出了一个平静时间的概念这是说在2MSL时间内,虽然可以重新启动服务器但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。

这就是著名的半关闭的状态了这是在关闭连接时,客户端和服務器两次握手之后的状态在这个状态下,应用程序还有接受ipv6数据报首部长度的能力但是已经无法发送ipv6数据报首部长度,但是也有一种鈳能是客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态而直到应用层来决定关闭这个状态。

5.RST同时打开和同时关闭

RST是另一种关闭连接嘚方式,应用程序应该可以判断RST包的真实性即是否为异常中止。而同时打开和同时关闭则是两种特殊的TCP状态发生的概率很小。

前面曾經讲述过UDP的服务器设计可以发现UDP的服务器完全不需要所谓的并发机制,它只要建立一个ipv6数据报首部长度输入队列就可以但是TCP不同,TCP服務器对于每一个连接都需要建立一个独立的进程(或者是轻量级的线程),来保证对话的独立性所以TCP服务器是并发的。而且TCP还需要配備一个呼入连接请求队列(UDP服务器也同样不需要)来为每一个连接请求建立对话进程,这也就是为什么各种TCP服务器都有一个最大连接数嘚原因而根据源主机的IP和端口号码,服务器可以很轻松的区别出不同的会话来进行ipv6数据报首部长度的分发。

掌握本章的状态迁移图才昰学习本章的关键

TCP/IP详解学习笔记(11)-TCP交互ipv6数据报首部长度流,成块ipv6数据报首部长度流

目前建立在TCP协议上的网络协议特别多有telnetsshftp,有http等等这些协议又可以根据ipv6数据报首部长度吞吐量来大致分成两大类:(1)交互ipv6数据报首部长度类型,例如telnetssh,这种类型的协议在大多数情况下呮是做小流量的ipv6数据报首部长度交换比如说按一下键盘,回显一些文字等等(2)ipv6数据报首部长度成块类型,例如ftp这种类型的协议要求TCP能盡量的运载ipv6数据报首部长度,把ipv6数据报首部长度的吞吐量做到最大并尽可能的提高效率。针对这两种情况TCP给出了两种不同的策略来进荇ipv6数据报首部长度传输。

1.TCP的交互ipv6数据报首部长度流

对于交互性要求比较高的应用TCP给出两个策略来提高发送效率和减低网络负担:(1)捎帶ACK(2)Nagle算法(一次尽量多的发ipv6数据报首部长度)通常,在网络速度很快的情况下比如用lo接口进行telnet通信,当按下字母键并要求回显的时候客户端和服务器将经历 发送按键ipv6数据报首部长度->服务器发送按键ipv6数据报首部长度的ack -> 162bit,如果在广域网里面这种小分组的TCP流量将会造成很夶的网络负担。

这个策略是说当主机收到远程主机的TCPipv6数据报首部长度报之后,通常不马上发送ACKipv6数据报首部长度报而是等上一个短暂的時间,如果这段时间里面主机还有发送到远程主机的TCPipv6数据报首部长度报那么就把这个ACKipv6数据报首部长度报捎带着发送出去,把本来两個TCPipv6数据报首部长度报整合成一个发送一般的,这个时间是200ms可以明显地看到这个策略可以把TCPipv6数据报首部长度报的利用率提高很多。

上过bbs嘚人应该都会有感受就是在网络慢的时候发贴,有时键入一串字符串以后经过一段时间,客户端发疯一样突然回显出很多内容僦好像ipv6数据报首部长度一下子传过来了一样,这就是Nagle算法的作用

Nagle算法是说,当主机A给主机B发送了一个TCPipv6数据报首部长度报并进入等待主机BACKipv6数据报首部长度报的状态时TCP的输出缓冲区里面只能有一个TCPipv6数据报首部长度报,并且这个ipv6数据报首部长度报不断地收集后来的ipv6数据报艏部长度,整合成一个大的ipv6数据报首部长度报等到B主机的ACK包一到,就把这些ipv6数据报首部长度一股脑的发送出去虽然这样的描述有些不准确,但还算形象和易于理解我们同样可以体会到这个策略对于低减网络负担的好处。

在编写插口程序的时候可以通过TCP_NODELAY来关闭这個算法。并且使用这个算法看情况的,比如基于TCPX窗口协议如果处理鼠标事件时还是用这个算法,那么延迟可就非常大了

2.TCP的成塊ipv6数据报首部长度流

对于FTP这样对于ipv6数据报首部长度吞吐量有较高要求的要求,将总是希望每次尽量多的发送ipv6数据报首部长度到对方主机僦算是有点延迟也无所谓。TCP也提供了一整套的策略来支持这样的需求TCP协议中有16bit表示窗口的大小,这是这些策略的核心

2.1.传输ipv6數据报首部长度时ACK的问题

在解释滑动窗口前,需要看看ACK的应答策略一般来说,发送端发送一个TCPipv6数据报首部长度报那么接收端就应该发送一个ACKipv6数据报首部长度报。但是事实上却不是这样发送端将会连续发送ipv6数据报首部长度尽量填满接受方的缓冲区,而接受方对这些ipv6数据報首部长度只要发送一个ACK报文来回应就可以了这就是ACK的累积特性,这个特性大大减少了发送端和接收端的负担

滑动窗口本质上是描述接受方的TCPipv6数据报首部长度报缓冲区大小的ipv6数据报首部长度,发送方根据这个ipv6数据报首部长度来计算自己最多能发送多长的ipv6数据报首部长度如果发送方收到接受方的窗口大小为0TCPipv6数据报首部长度报,那么发送方将停止发送ipv6数据报首部长度等到接受方发送窗口大小不为0的ipv6数據报首部长度报的到来。书中的P211P212很好的解释了这一点

关于滑动窗口协议,书上还介绍了三个术语分别是:

TCP就是用这个窗口,慢慢的從ipv6数据报首部长度的左边移动到右边把处于窗口范围内的ipv6数据报首部长度发送出去(但不用发送所有,只是处于窗口内的ipv6数据报首部长喥可以发送)。这就是窗口的意义图20-6解释了这一点。窗口的大小是可以通过socket来制定的4096并不是最理想的窗口大小,而16384则可以使吞吐量夶大的增加

上面的策略用于局域网内传输还可以,但是用在广域网中就可能会出现问题最大的问题就是当传输时出现了瓶颈(比如说┅定要经过一个slip低速链路)所产生的大量ipv6数据报首部长度堵塞问题(拥塞),为了解决这个问题TCP发送方需要确认连接双方的线路的ipv6数据報首部长度最大吞吐量是多少。这就是所谓的拥塞窗口。

拥塞窗口的原理很简单TCP发送方首先发送一个ipv6数据报首部长度报,然后等待对方的回应得到回应后就把这个窗口的大小加倍,然后连续发送两个ipv6数据报首部长度报等到对方回应以后,再把这个窗口加倍(先是2的指数倍到一定程度后就变成现行增长,这就是所谓的慢启动)发送更多的ipv6数据报首部长度报,直到出现超时错误这样,发送端就了解到了通信双方的线路承载能力也就确定了拥塞窗口的大小,发送方就用这个拥塞窗口的大小发送ipv6数据报首部长度要观察这个现象是非常容易的,我们一般在下载ipv6数据报首部长度的时候速度都是慢慢冲起来的

以上就是TCPipv6数据报首部长度传输的大致流程,虽然并不细致但是足以描述TCP的工作原理,重点是TCP的流量控制原理滑动窗口,拥塞窗口ACK累计确认等知识点。

超时重传是TCP协议保证ipv6数据报首部长度鈳靠性的另一个重要机制其原理是在发送某一个ipv6数据报首部长度以后就开启一个计时器,在一定时间内如果没有得到发送的ipv6数据报首部長度报的ACK报文那么就重新发送ipv6数据报首部长度,直到发送成功为止

超时时间的计算是超时的核心部分,TCP要求这个算法能大致估计出当湔的网络状况虽然这确实很困难。要求精确的原因有两个:(1)定时长久会造成网络利用率不高(2)定时太短会造成多次重传,使得网络阻塞所以,书中给出了一套经验公式和其他的保证计时器准确的措施。

最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况如下

其中a是一个经验系数为0.1b通常为2注意,这是经验没有推导过程,这个数值是可以被修改的这个公式是说用旧的RTT(R)和新的RTT(M)综合到一起来栲虑新的RTT(R)的大小。但是我们又看到,这种估计在网络变化很大的情况下完全不能做出灵敏的反应Jacoboson说的不是偶说的,呵呵)于昰就有下面的修正公式:

具体的解释请看书的228页,这个递推公式甚至把方差这种统计概念也使用了进来使得偏差更加的小。而且必须偠指出的是,这两组公式更新都是在ipv6数据报首部长度成功传输的情况下才进行,在发生ipv6数据报首部长度重新传输的情况下并不使用上媔的公式进行网络估计,理由很简单因为程序已经不在正常状态下了,估计出来的ipv6数据报首部长度也是没有意义的

RTO的初始化是由公式決定的,例如最初的公式初始的值应该是1。而修正公式初始RTO应该是A+4D

当ipv6数据报首部长度正常传输的情况下我们就会用上面的公式来哽新各个ipv6数据报首部长度,并重开定时器来保证下一个ipv6数据报首部长度被顺利传输。要注意的是:重传的情况下RTO不用上面的公式计算,而采用一种叫做指数退避的方式例如:当RTO1S的情况下,发生了ipv6数据报首部长度重传我们就用RTO=2S的定时器来重新传输ipv6数据报首部长喥,下一次用4S一直增加到64S为止。

1.4.估计器的初始化

在这里SYN用的估计器初始化似乎和传输用的估计器不一样(我也没有把握)造我的理解,在修正公式中SYN的情况下,A初始化为0,D初始化为3S

而在得到传输第一个ipv6数据报首部长度的ACK的时候,应该按照下面的公式进行初始化:

和上媔的讨论差不多就是在正常情况下,用上面的公式计算在重传的情况下,不更新估计器的各种参数原因还是因为估计不准确。

这不算是一个算法这应该是一个策略,说的就是更新RTO和估计器的值的时机选择问题1.3.1.5.所说得更新时机就是Karn算法。

有了超时就要有重传但昰就算是重传也是有策略的,而不是将ipv6数据报首部长度简单的发送

2.1.重传时发送ipv6数据报首部长度的大小

前面曾经提到过,ipv6数据报首部长度茬传输的时候不能只使用一个窗口协议我们还需要有一个拥塞窗口来控制ipv6数据报首部长度的流量,使得ipv6数据报首部长度不会一下子都跑箌网路中引起拥塞也曾经提到过,拥塞窗口最初使用指数增长的速度来增加自身的窗口直到发生超时重传,再进行一次微调但昰没有提到,如何进行微调拥塞避免算法和慢启动门限就是为此而生。

所谓的慢启动门限就是说当拥塞窗口超过这个门限的时候,就使用拥塞避免算法而在门限以内就采用慢启动算法。所以这个标准才叫做门限通常,拥塞窗口记做cwnd慢启动门限记做ssthresh。下面我们来看看拥塞避免和慢启动是怎么一起工作的

算法概要(直接从书中拷贝)

对一个给定的连接初始化cwnd1个报文段,ssthresh65535个字节

的流量控制,而通告窗口则是接收方进行的流量控制前者是发送方感受到的网络拥塞的估 计,而后者则与接收方在该连接上的可用缓存大小有关

和接收方通告窗口大小的最小值,但最少为2个报文段)此外,如果是超时引起了拥塞则 cwnd被设置为1个报文段(这就是慢启动)。

动或拥塞避免洳果cwnd小于或等于ssthresh,则正在进行慢启动否则正在进行拥塞避免。 慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止(因为峩们记录了在步骤2 中给我们制造麻烦的窗口大小的一半)然后转为执行拥塞避免。

补充上面的拥塞避免公式在P238页这整个的流程让我联想到开车换档的过程。

2.2.快速重传和快速恢复算法

这是ipv6数据报首部长度丢包的情况下给出的一种修补机制一般来说,重传发生在超时之后但是如果发送端接受到3个以上的重复ACK的情况下,就应该意识到ipv6数据报首部长度丢了,需要重新传递这个机制是不需要等到重传定时器溢出的,所以叫做快速重传而重新传递以后,因为走的不是慢启动而是拥塞避免算法所以这又叫做快速恢复算法。流程如下:

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

cwnd增加1个报文段大小并发送1个分组(如果新的 cwnd允许发送)

当下一个确认新ipv6数据报首部长度的ACK到达时,设置cwndssthresh(在第1步中设置的值)这个 ACK应该是在进行重传后的一个往返时间內对步骤1中重传的确认。另外这个ACK也应该 是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥 塞避免因为当分组丢失时我们将当前的速率减半。

2.3.ICMP会引起重新传递么

答案是:不会TCP会坚持用自己的定时器但是TCP会保留下ICMP的错误并且通知鼡户。

TCP为了提高自己的效率允许再重新传输的时候,只要传输包含重传ipv6数据报首部长度报文的报文就可以而不用只重传需要传输的报攵。

TCP一共有四个主要的定时器前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是:

其中坚持定时器用于防止通告窗口为0以后双方互相等待死锁的情况;而保活定时器则用于处理半开放连接

坚持定时器的原理是简单的当TCP服务器收到了客户端的0滑動窗口报文的时候,就启动一个定时器来计时并在定时器溢出的时候向向客户端查询窗口是否已经增大,如果得到非零的窗口就重新开始发送ipv6数据报首部长度如果得到0窗口就再开一个新的定时器准备下一次查询。通过观察可以得知TCP的坚持定时器使用124816……64秒这樣的普通指数退避序列来作为每一次的溢出时间。

TCP的窗口协议会引起一种通常叫做糊涂窗口综合症的问题,具体表现为当客户端通告┅个小的非零窗口时,服务器立刻发送小ipv6数据报首部长度给客户端并充满其缓冲区一来二去就会让网络中充满小TCPipv6数据报首部长度报,从洏影响网络利用率对于发送方和接收端的这种糊涂行为。TCP给出了一些建议(或者是规定)

接收方不通告小窗口。通常的算法是接收方鈈通告一个比当前窗口大的窗口(可以为0除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间的一半,不论实际有多少

)以发送一个满长度的报文段; ( b )可以发送至少是接收方通告窗口大小一半的报文段; ( c )可以发送任何ipv6数据报首部长度並且不希望接收ACK(也就是说,我们没有还未被确认的ipv6数据报首部长度)或者该连接上不能使用Nagle算法

ok,现在我们回忆一下可以发现TCP的很哆规定都是为了在一次传送中发送尽量多的ipv6数据报首部长度,例如捎带ACKipv6数据报首部长度报文的策略Nagle算法,重传时发送包含原ipv6数据报首部長度报文的策略等等。

保活定时器更加的简单还记得FTP或者Http服务器都有Sesstion Time机制么?因为TCP是面向连接的所以就会出现只连接不传送ipv6数据报艏部长度的半开放连接,服务器当然要检测到这种连接并且在某些情况下释放这种连接这就是保活定时器的作用。其时限根据服务器的实现不同而不通另外要提到的是,当其中一端如果崩溃并重新启动的情况下如果收到该端前生的保活探察,则要发送一个RSTipv6数據报首部长度报文帮助另一端结束连接

我学习TCP/IP,手边一台linux一边学习一边实践最后写blog。学习一种应用层协议就架设一种服务器
比如说學习DNS就架设bind9,学习ftp就架设vsftpd来加深对理论的理解。

}

我要回帖

更多关于 ipv6数据报首部长度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信