最近把之前看过的三本关于网络的书一起做了一下总结。
第一本是谢希仁的《计算机网络》,这本算是为数不多的国内的好教材,里面虽然有些内容过时,稍显臃肿,但是有些章节讲的非常不错。
第二本是《图解TCP/IP》,日本人写的书,非常认真细致,文字结合大量图片通俗易懂,入门不错,但是还是不够深入。
第三本是《TCP/IP详解卷1》,美国人写的书学术性质较强,比较难懂,但是很深入。结合tcpdump输出结果能让人更好的理解。
在看这本卷1之前,特地去先学习了一下《wireshark数据报分析实战》,跟着提供的例子学习了一下。这本书非常好的一个地方就是让抽象的东西具体化,比如三次握手SYN,ACK包,四次挥手FIN,ACK的发送接收情况可以一目了然。
同时,我也自己尝试抓了一下学校无线网的登陆过程,在HTTP包里面发现无线网登录验证居然是明文的,也就是说可以弄个抓取无线信号的装置包括手机信号都可以抓到,然后对有兴趣的内容进行分析。总的来说,看完这本数据包分析,加上前面2本书,看卷一感觉不会吃力。
下面先放上自己用XMind画的思维导图,主要还是卷1的内容,有部分内容结合了前面两本书。
下面再附上整本书的笔记,都是一些重点章节的的重点内容。
ch1 概述
1.TCP/IP分层:物理层,数据链路层(ARP),网络层(IP,ICMP,IGMP),传输层(TCP,UDP),应用层。
ABCDE类地址。A类网络号8位(第一位0),24位主机号。
B类网络号16位(前二位10),16位主机号。
C同理,D类前面4位1110+28位多播组号。
2.封装和分用,分用时每层都检测报文表示的协议首部得到上层协议。ICMP与IGMP都被封装在IP数据包里,相当于IP的上层,但实际他们是同一层协议。
3.一共有16位65535个端口号,其中保留端口号:1~1023。
ch2 链路层
1. 802标准定义封装
2. 以太网首部封装至少64字节:目的地址+源地址(48 bit)+类型(2byte)+数据(至少46字节不足填充pad)+CRC(4byte)
3. SLIP(串行线路IP):IP数据包以END(0xc0)作为开头和结尾;IP报文中某个字符的END用0xdb和0xdc代替;0xdb被称为SLIP的ESC字符,若IP报文段出现此字符,用0xdb和0xdd取代。(与以太网封装比无类型和首部)
4. PPP(点对点协议):由LCP链路控制协议和NCP网络控制协议组成。PPP支持多种协议,而SLIP只支持IP,PPP有CRC检验。PPP不涉及ARP。
5. 环回接口:localhost127.0.0.1
传给环回地址的数据均作为IP输入,应用程序有可能省略了传输层和网络层的操作,也可能实现了。
6.最大传输单元MTU:以太网为1500 MSS:最大报文段长度=MTU-首部长(IP首部与上层协议首部和)
ch3 IP(网际协议)
1. IP协议提供不可靠,无连接,尽最大努力交付的服务。采用大端字节序传输。
2.首部格式:
首部长度占4位,单位为4字节;总长度16位,单位为1字节。
服务类型:第4~7位的TOS:最小时延,最大吞吐量,最高可靠性,最小费用
注意IP中的选项与TCP的选项字段区别,一般IP的选项字段较少使用。
2. IP路由:
a) 搜索路由表,寻找能与目的IP完全匹配的条目。
b) 搜索路由表,寻找能与目的网络号相匹配的条目。
c) 搜索路由表,寻找标为默认的条目,如果没找到,向发送的主机返回一个主机不可达或网络不可达。
注意:1)所有主机和路由器都使用了默认路由
2)源目的IP始终不变化
3)每个链路层有不同的数据帧首部,而且链路层的目的MAC地址指的是下一站的链路层地址,源MAC地址就是发送者,通过ARP请求得到。
3. 子网寻址:主机号再分解成一个子网号和主机号并由系统管理员进行分配。
4. 子网掩码:确定子网号和主机号的分界线,确定IP属于本子网主机或本网络其他子网主机或其他网络主机。
CIDR:无类型域间选路,192.168.1.1/20表前20位网络号,后面是主机号,遵守最长匹配原则。
5. ifconfig -a报告所有接口信息
netstat-in打印出所有接口信息和IP地址而不是名字
ch4 ARP地址解析协议
1. 如果目的主机与发送主机位于同一个局域网,则设备驱动程序从不检查IP数据包中目的IP地址,而是根据以太网MAC地址确定目的接口。
2. ARP分组格式,以太网帧类型包括IP数据包,ARP/RARP请求和应答。协议类型表示要映射的协议地址的类型。op是指四种操作类型,ARP请求值为1,ARP应答2…...
3. ARP请求包目的地址为ff:ff:ff:ff为广播地址,收到应答方回应后,不仅发送方要把应答方mac地址写入高速缓存,应答方也把发送方的mac地址写入自己的高速缓存,高速缓存的生存时间一般为20分钟。
4. 以下是使用ARP的四种典型情况:
网1(H1,H2)------路由器R1-------网2(H3)--------路由器R2---------网3(H4)
a) 发送方是主机H1,要把IP数据包发送到同个网络3的另一台主机H2,只用在网1发送一个arp广播,找到目的主机H2的mac地址
b) 发送方是主机H1,要把IP数据包发送给另外一个网络3的一台主机H4,同样在网1广播arp包,找到路由器R1的mac地址,剩下工作R1完成
c) 发送方是路由器,发送方是路由器R1,目的是同个网络2中的H3,直接在网2广播,找到主机H3的mac地址
d) 发送方是路由器R1,接收方是另个网络3的主机H3,R1在网2广播,找到连接在网2的路由器R2的mac地址,剩下的工作由R2完成
此过程中,IP数据包源目的IP始终不变,而数据包的源目mac地址始终在不断改变。这些中间经过的路由器也称为委托ARP或ARP代理。
5.免费ARP:主机发送ARP查询自己的IP地址
a)如果另外的主机设置了相同的IP地址,会产生一个错误信息
b)使用ARP请求中的发送端硬件地址更新高速缓存
6.arp -a显示ARP高速缓存的所有内容
-d删除某一个内容 -s增加高速缓存的内容
ch6 ICMP网际控制报文协议
1. 首部由8位类型,8位代码,16检验和,内容组成。报文种类分为ICMP差错报告报文,ICMP询问报文。
a) 差错报告报文类型:
i. 目的不可达(端口号不正确)
ii. 源点抑制(主机由于拥塞而丢弃数据报)
iii. 超时(TTL为0)
iv. 参数问题(首部字段值不正确)
v. 改变路由(重定向)
不应该发送ICMP差错报文的几种情况:
1) ICMP差错报文
2) 目的地址为广播或多播地址,包括链路层的广播数据报(防止广播风暴)
3) 除了IP分片的第一片
4) 源地址不是单个主机的数据报
b) 询问报文
i. 回显请求和回答(测时目的站是否可达及状态信息)
ii. 时间戳请求和回答(请某个主机或者路由器回答当前日期时间)
2. ICMP端口不可达差错
假设使用UDP查看该报文,每个“UDN端口不可达”返回的ICMP报文共70字节:
以太网首部 |
IP首部 |
ICMP首部 |
产生差错的数据报IP首部 |
UDP首部 |
14字节 20字节 8字节 20字节 8字节
ß---------------------------IP数据报------------------------------------à
ß---------------ICMP报文---------------------------------à
ß----------------------ICMP数据部分------à
发送前一个IP首部的目的使ICMP知道如何解释后面8字节的协议部分。
0 7 8 15 16 32
类型3 |
代码0-15 |
检验和 |
未用 |
||
IP首部+原始IP数据报中前8个字节(得到源端口号和目的端口号) |
ICMP不可达报文
在ICMP报文中,当代码为4时,在路径MTU发现机制允许路由器把外出接口的MTU填在第二个32bit的低16位中。
ch7 ping程序
1. 如果不能ping到某台主机,也可能是由于路由器防火墙过滤。
ICMP回显请求和回显应答报文格式
标识符通常为进程ID,序号从0开始,每发送一次回显请求就加1,有可能丢失、失序、重复。执行ping返回seq和time。
2. ping -R提供了路由记录的功能,由于IP首部字段长度为4bit,15字节*4字节单位=60字节最大,60-20首部固定长度-3RR选项(code,len,ptr)=37字节,最多只能存9个地址。code为IP选项的类型这里为7,len为RR选项总长度,ptr指向存放下个IP的位置。
3. IP时间戳选项,与记录路由选项类似,此处code为0x44,还多了OF溢出和FL标志字段共1字节。
ch8 traceroute程序
1. 由于IP首部留给选项空间十分有限,并不是每个路由器都支持这个选项。
2. traceroute程序通过区分接受到的ICMP报文是超时(经过路由)还是端口不可达(到达目的主机)以确定结束时间,显示的结果就是中间经过的路由器以及所花费的时间,*表示未探查到应答信号。
3. ICMP超时报文结构与ICMP不可达类似,不同的是其类型为11,代码为0或1。
4. IP源站选路选项:
a) 宽松的源站选路,指定经过的IP清单,但其中可通过其他路由器。
b) 严格的源路由选择,采用确切路由。
ch9 IP选路
1.路由表经常被访问,但被路由守护程序大约30秒更新一次,收到ICMP重定向报文也会更新路由表。IP提供选路机制,路由守护程序提供选路策略。
2.搜索路由表的几个步骤:
a) 搜索匹配的主机地址
b) 搜索匹配的网络地址
c) 搜索默认表项
4. netstat -rn
a) 其中Flags的U表示可用,G表示该路由为网关(路由器),H表目的为主机(没设置就是网络地址),D表该路由由重定向创建,M表该路由已被重定向修改。
b) G标志区分了直接路由和间接路由。
i. 间接路由时,网关地址是路由器。
ii. 直接路由,目的mac地址为点对点链路的另一端,网关地址为外出接口的本地IP地址。
c) Refcnt表示正在使用路由的活动进程个数
d) use表示通过该路由发送的分组个数
5. 每个主机都必须支持多个默认路由,常见的实现方式是按轮转使用它们。
6. 可以从没有H的那行得出目的地址的子网掩码,因为那行所代表的目的地址为网络地址。
7. IP选路的方式就按照上面3个所列,目的IP始终不变,目的mac地址为路由器或者目的端地址。
8. 初始化路由表可以手动设置(较少),运行路由守护程序,使用较新的路由器发现协议。对主机来说为静态选路,适合于网络较小且与网络只有单个连接点。
9. 对于没有到达目的地的路由,如果该IP报由主机产生,就给发送该数据包的应用程序返回一个差错;如果是被转发的数据报,就给原始发送端发送ICMP主机不可达差错报文。
10. ICMP重定向一般让具有很少选路信息的主机逐渐建立更完善的路由表,重定向报文是为主机服务,而不是路由器;路由表还可以由路由器发现报文改变。但是不能同时被这2种方式修改。
11. 主机做路由器时要满足:
d) 出接口必须等于入接口
e) 用于向外传送数据报的路由不能被ICMP重定向报文创建或修改,不能为默认路由
f) 数据报不能用源站选路转发
g) 内核必须配置成可以发送重定向报文
12. 收到ICMP重定向修改路由表之前要做的检查:
h) 新的路由器必须直接与网络相连
i) 重定向报文必须来自当前到目的地所选择的路由器
j) 重定向报文不能让主机本身做路由器
k) 被修改的路由必须为间接路由
路由器应该发送的是对主机的重定向,而不是对网络的重定向。
13. 初始化路由表的另外一种方法是广播或者多播传送一份路由器请求报文(由用户进程产生)。ICMP路由器通告报文使得路由器在一份报文中可以通告多份报文,路由器地址和优先级组成一项,值越大说明作为默认路由器的优先级越高,默认一般为0,0x80000000表不可做默认路由器使用。
14. 路由器会定期随机传送通告报文,并且监听来自主机的请求报文。主机引导期间一般发送3份路由器请求报文,同时也会监听来自相邻路由器的通告报文。
ch10 动态选路协议
1. 通过路由器上的路由守护进程,如routed,gated
2. 内部网关协议:选路信息协议RIP、最短路径优先OSPF
外部网关协议BGP
3. RIP报文包含在UDP数据包中,4字节固定首部。常用的UDP端口号是520。命令字段1表请求,2表应答。一个报文最多可有25个路由,每个路由占20字节格式。
启动的过程如下:
a) 初始化,在每个打开的接口发送请求报文(一般是广播路由控制信息)。
b) 接收到请求,如果是特殊请求就发送完整路由表。否则就根据距离向量依次处理每一个,如果是连接到指明地址的路由设置成我们的值,否则就设置为16表无穷大。
c) 接受到响应,可能会更新路由表,增加、修改、删除。
d) 定期选路更新,每过30秒,素有或部分路由器将完整路由表发送给相邻路由器。
e) 触发更新,不需要发送完整路由表只需要发送那些发生变化的表项。
4. 可能产生的问题:
无限计数 ,解决办法:
a) 最长距离不大于16
b) 路由器不再把所受到的路由消息原路返回给发送端
路由环路:
c) 毒性逆转:网络中发生链路中断,不是不发送这个消息而是把这个无法通信的消息传播出去,即发送距离为16的信息。
d) 触发更新:指路由信息变化时,不等待30秒而是立刻发送出去。
这两种方法可以使路由信息尽快收敛。
5. 由于RIPv1 会自动汇总有类网络间各子网的路由,所以RIPv1不支持不连续子网。不连续子网指在一个网络中,某几个连续由同一主网划分的子网在中间被多个其它网段的子网或网络隔开了。RIPv2支持不连续子网。
6. 假设R4->R6发来路由表,要更新R6的路由表,步骤如下:
a) R4表所有距离加1,下一跳改为R4
b) 若R4中有与R6不同的项目,加入R6的路由表
c) 若R4,R6中目的网络,下一跳路由器一致,就更新R6的距离为R4提供的距离
d) 若R4,R6目的网络名一样,下一跳不同,则在R6表更新较短的距离
7. RIP2中选路域为选路守护程序的标识符,可以使进程号。选路标记为支持外部网关协议存在,携带一个EGP和BGP的自制系统号。每一个路由表象增加了一个32位子网掩码和32位下一站IP(0表示发往目的地址的报文应该发送给发送RIP报文的系统)。
8. OSPF最短路径优先有5种类型的包:
a) 问候 b)数据库描述 c)链路状态请求 d)链路状态更新
i. 通过发送问候包确认是否连接。
ii. 利用数据库描述包相互发送路由摘要信息和版本信息,若版本较老,首先发送一个链路状态更新请求路由控制信息。
iii. 然后由状态更新包接受路由状态信息,最后再通过链路状态确认包通知大家本地已经接受到路由控制信息。
链路状态更新包有2类信息,一是网络LSA(链路状态通告),二是路由器LSA,每个路由器生成一个表示网络结构的链路状态数据库,根据这个数据库采取dijkstra算法生成相应的路由控制表。
9. BGP边界网关协议中数据包送达目的网络时,会生成一个中途经过所有AS(自治系统)的编号列表,在AS路径信息访问列表中不仅包含转发方向和距离,还包括途径所有AS的编号。BGP属于路径向量协议。
ch11 UDP用户数据报协议
1.
a) 伪首部是不存在的,只有在计算检验和时有用,检验和是简单的16bit和,它检测不出交换两个16bit的差错,如果数据报是奇数长度,要用填充字段填充。
b) UDP检验和可选(检验和字段为全0未开启),而TCP的检验和是必须的。
c) 如果发送端没有计算检验和而检测段检测到检验和有差错,该UDP数据报就被丢弃,不产生任何差错报文。
d) 接收端收到发送端报文后连同伪首部按二进制反码求和,无差错应为全1,否则丢弃。
e) 每次运行程序时,UDP源端口号都发生变化。
2. 路径MTU发现机制,每隔30s把DF设置为1,查看路径MTU是否增大了
a) UDP情况:
i. 发送时IP首部设置不分片,路由器丢包
ii. 由ICMP通知下一次MTU大小,通过不可达报文
iii. UDP没有重发处理,应用发送下一个消息时,UDP层传过来的数据报在IP层被分片,且对IP并不区分UDP首部和数据。到达目的后在IP层重组上传
b) TCP情况:
i. 发送时IP首部设置不分片,路由器丢包
ii. 由ICMP不可达报文通知下一次MTU大小
iii. 根据TCP的重发处理,数据报被重传。TCP负责将数据分成不会被IP层再分片的粒度后传给IP层,IP层不做分片处理
iv. 不需要IP层重组,数据被原样发送给接收端主机的TCP层
3. 当一份IP数据报被分片后,只有到达目的地才进行重组,已经分片过的数据报有可能会再进行分片。IP首部序号,标志字段,片偏移字段与分片有关。
4. IP分片传输过程,及时丢失一片数据也要重传整个数据报。除最后一片,每一片的数据报长度必须是8的整数倍。
5. IP首部被复制到各个片中,但是端口号和UDP首部只能在第一片中被发现。IP数据报是IP层端到端的传输单元,分组是指IP和链路层之间传送的数据单元。分组可以是完整的IP数据报也可以是一个分片。
6. UDP与ARP的交互:我们发送一个会被IP层分成6片的UDP数据报,且运行程序前,ARP缓存是空的。
a) 每个数据报片会引发一个ARP请求,在接受到第一个ARP应答时,只发送最后一个数据报片,前5个均被丢弃了。在大多数实现中,在等待一个ARP应答时,只将最后一个报文发送给特定目的主机。
b) 在收到第一个数据报片,IP层启动一个定时器,定时器超时而所有数据报片未能全部到达,这些数据报将被丢弃。但是除非接收到第一个数据报片,否则不会产生ICMP组装超时差错,因为只有第一个数据报片包含了运输层首部(为了区分是哪个进程所发送的数据报)。
7. UDP首部最大65535字节,数据部分65507字节,TCP/IP内核也会限制。一般应用都限制应用程序数据为512字节或更小。
8. 设计UDP服务器时可以限制本地IP地址,远端IP地址;采用多播可以使每个端口有多个接收者:即多个端点可使用同个IP地址和UDP端口号。
ch12 广播和多播
1. 只用于UDP。广播是一个主机要向网上所有其他主机发送帧。多播是帧仅传送给属于多播组的多个主机。多播适用于一个局域网或者跨越临近局域网的多播。
2. 协议栈各层对收到帧的过滤过程:接口卡->设备驱动程序->IP->UDP->进程
3. D类IP地址格式:4位1110+28位多播组ID
a) 能够接受发往一个特定多播组地址数据的主机集合称主机组。主机组可跨网络,主机组多主机数量无限制,不属于某主机组主机可向该组发送信息。
b) 224.0.0.1代表该子网内所有系统组,224.0.0.2代表该子网内所有路由器组,224.0.0.1用作网络时间协议NTP,224.0.0.9用作RIP2
4. a) IP多播地址对应的以太网范围01:00:5e:00:00:00~01:00:5e:ff:ff:ff其中01指明为以太网多播地址,其中23bit用于与IP多播组号对应,通过将多播组号低位23bit映射到以太网低位23bit实现。
b) 由于多播组号的最高5bit在映射过程被忽略,因此会有32个不同的多播组号被映射为一个以太网地址,那么设备驱动程序或IP层就必须对数据报进行过滤。
5. 单个物理网络中:多播进程将目的IP地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后发送数据。接受进程要通知IP层他们想接受的发往给定多播地址的数据报,且设备驱动程序要能接受这些多播帧。
6. 确认是否有接收端,通过IGMP:网际组管理协议实现。
ch17 TCP传输控制协议
1. TCP通过下列方式来提供可靠性:
a) 应用数据被分割成TCP认为最合适发送端数据块。
b) 自适应的超时以及重传策略。
c) TCP收到数据的确认机制,包括延迟确认。
d) 检验和,若不对就丢弃等待发送端超时重传。
e) TCP 包失序的数据排序后上交应用层。
f) 接收端丢弃重复的报文段。
g) 发送端使用拥塞窗口,接收端使用通告窗口进行流量控制。
2. TCP首部:
URG=1告诉系统此报文段有紧急数据要优先传送,紧急指针字段有效指向紧急数据的末尾在报文段的位置。
ch18 TCP连接的建立与终止
2. 四次挥手:
值得注意的是:
a) SYN和FIN占用一个序号,而ACK不占用序号。ACK报文段通常只有一个IP首部和TCP首部
b) ISN可看做是一个32bit的计数器,每4ms加1。
c) TIME-WAIT等待2MSL(2倍最长报文段寿命)的原因:
i. 为保证A发送的最后一个ACK可以到达B。这个报文有可能丢失,如果B在LAST-ACK时间未收到确认,就会重传这个FIN+ACK,接着A重传确认,重启2MSL定时器。
ii. 保证下一个新的连接中不会出现这种旧的连接请求报文段。防止来自该连接的上一个连接的迟到报文段作为新连接的一部分。一个插口对(源目的IP,源目的端口)唯一确定一组连接。
3. 最大报文段长度MSS:
a) 当连接建立时,双方都要通告各自的MSS,如果一方不接受另一方的MSS,则MSS就设定为默认值536字节。通常一方的MSS=外出接口MTU-IP首部-TCP首部。
b) 如果目的IP与源IP不属于同个网络,MSS默认值通常为536字节。大多数TCP实现都提供一个选项设置MSS尽可能的大。MSS恰当的值是恰好不会被IP分片。
4. 通常应用程序调用shutdown半关闭,close终止两个方向的连接。半关闭表示客户端已经完成了它的数据传送,但仍要接受服务器的数据。发送FIN实际传送了一个文件结束符。
5.
实线箭头:说明客户的正常状态变迁。 虚线:为服务器的正常状态变迁。
应用:应用执行某种操作时发生的状态变迁。 接收:表示收到TCP报文段状态的迁移。
发送:表示为进行某个状态变迁要发送的TCP报文段。
a) 两个导致进入ESTABLISHED状态的变迁对应打开一个连接,而导致离开ESTABLISHED状态的变迁对应关闭一个连接。ESTABLISHED表双方已经能够双向传递数据。
b) 只有当SYN_RCVD状态是由LISTEN状态进入,而不是SYN_SENT进入时,从SYN_RCVD回到LISTEN的状态变迁才是有效的。
6. TCP重启后的MSL秒内不能建立任何连接,我们称之为平静时间。
7. 发送复位RST的情况:
a) 到不存在端口的连接。
b) 异常终止一个连接。
c) 检测半打开连接。比如当客户端与主机突然断开,并重启服务器,客户端继续发送数据,服务器将回应RST。
8. 对同时打开的处理是仅建立一条连接而不是两条。
9. 同时关闭:应用层发出关闭命令,两端均从ESTABLISHED变为FIN_WAIT_1,当收到另一端发来的第一个FIN就进入CLOSING,同时发出最后一个ACK后就进入TIME_WAIT。
10. TCP选项:
TCP首部中窗口扩大选项长度为16位,因此最大的窗口大小为64k,窗口扩大选项占3位,最大值14,相当于窗口最大值增大到2^(16+14)-1
时间戳选项:a)计算往返RTT b)用来处理TCP序号超过2^32的情况,即防止序号绕回PAWS。
11. TCP服务器的设计:
a) TCP通过四元组唯一确定一组连接。也可以限定本地、远端IP地址。
b) 积压值说明TCP监听的端点已被接受(三次握手完成)而等待应用层接受的最大连接数。积压值并不影响系统所允许的最大连接数,或并发服务器所能处理的客户。
c) 应用层只有在三次握手中第三个报文段收到后才知道这个新连接,当客户进程连接打开但服务器应用层还不知道这个新连接时,服务器的TCP仅将接受的数据放入缓冲队列。
d) 如果对于新的连接请求,连接队列没有空间,TCP不会理会收到的SYN(也不发回RST)。
e) TCP无法使客户进程的主动打开失效。当心客户连接传递给应用程序时,TCP的三次握手已经结束,客户的主动打开已经成功。服务器不打算为客户进行服务所能做也就是关闭这个连接。
ch19 TCP的交互数据流
1. 按照分组数量计算,约有一半的数据包含成块数据,另一半则包含交互数据。按照字节计算二者比例大约9比1。
2. 延迟确认(捎带确认):通常TCP在接收到数据时并不立刻发送ACK,推迟发送,以便将ACK与需要沿该方向发送的数据一起发送。
3. Nagle算法:TCP收集少量的分组,并在确认到来时以一个分组的方式发出去。确认到达的越快,数据也就发送的越快。
ch20 TCP的成块数据流
1. 线路上分组顺序依赖于许多无法控制的因素:
a) 发送方与接收方TCP的实现。
b) 接受进程读取数据。
c) 网络的动态性。
2. 滑动窗口表明可以立刻发送多少数据。当收到一个有效的ACK时,窗口左侧会向右合拢,窗口右边右移(窗口张开)将允许发送更多的数据。如果收到一个指示窗口向左移动的ACK,被认为是一个重复的ACK会被丢弃。
a) 发送发不必发送全窗口大小
b) 来自接收方的确认数据把窗口右移
c) 窗口大小可以减小,但是窗口右沿无法向左移动
d) 接收方发送一个ACK前也不必等待窗口填满
3. 发送方使用PSH标志通知接受方将受到的数据全部提交给应用程序,同时清空缓存。
4. 如果发送方一开始变向网络发送多个报文段,直到达到接收方通知的窗口大小,当二者处于同个局域网这个方式是可行的。但是如果二者之前存在多个路由器或速度较慢的链路,一些中间路由器必须缓存分组,有可能耗尽存储器的空间。因此必须采用慢启动算法:开始时把拥塞窗口cwnd=1,然后收到一个ACK拥塞窗口就增加一个报文段,呈指数增长。
5. 拥塞窗口是发送方使用的流量控制,通告窗口是接收方使用的流量控制。
6. 速率较慢的情况下发送时延(主机或路由器发送数据帧所花时间)其主要作用。
速度较快的情况下传播时延(电磁波在信道传播一定距离花费的时间)其主要作用。
对于高速链路,我们提高的仅仅是数据的发送数据,而不是传播速度。
7. 发送缓存存放:
a) 应用程序传送给发送方准备发送的数据
b) 已经发送未被确认的数据
接受缓存:
a) 按序号到达,但未被应用程序接受的数据
b) 未按序号到达的数据
8. 通道容量即带宽时延积 bit=带宽b/s * RTT
9. 一旦引起拥塞就会导致路由器丢弃分组
ch21 TCP的超时与重传
1. 重传定时器,坚持定时器(窗口大小探测),保活定时器,2MLS定时器。
2. 最简单的策略每次重传时间增加一倍,也就是指数退避。首次传输时间与复位信号时间相差9分钟,不可变。
3. RTT估计器的计算
karn 算法:当一个超时和重传发生时,在重传数据的确认最后到达时,不能更新RTT估计器。
a) 初始SYN:RTO=A+2D=0+2*3=6s
A是被平滑的RTT(均值的估计器,这里初始化为1)
D是被平滑的均值偏差,初始化为3
b) 当超时在5.8s(接近6s是因为使用了一个500ms的定时器)发生时,计算当前RTO=A+4D=12s,先使用倍数2,因此下一个超时时间取值为24s,再下一个取48s……假设重传到达了,此时因为karn算法,A,D值并未被更新。即使发送第一个数据报文段,此时的RTO还是24s。
c ) 当第一个数据报文段的ACK到达时,假设经历了3个时钟周期,估计器被初始化为: A=M+0.5=1.5+0.5=2 D=A/2=1 M表示所测量的RTT,
因此: RTO=A+4D=6s
d) 当第二个数据报文段的ACK到达时,假设经历了1个时钟周期,估计器按照 下面更新: Err=M-A=0.5-2=-1.5 右侧出现的A和D为上次的结果
A=A+gErr=2-0.125*1.5=1.8123 g=0.125
D=D+h(|Err | - D)=1+0.25*(1.5-1=1.125) h=0.25
RTO=A+4D=6.3124
4. 快速重传算法:发送端收到三个连续的ACK确认号,就重传ACK序号开头的报文段。即ACK确认号就是接收方下一个期望收到的序号。
5.拥塞避免算法:
a) 当拥塞发生时(超时或收到重复确认),慢启动门限ssthresh被设置为窗口大小的一半(拥塞窗口和接收方通知窗口的最小值,至少2个报文段)。如果是超时引起的拥塞则cwnd为设置为1个报文段进行慢启动。
b) 当cwnd 当cwnd>ssthresh,每收到一个确认,cwnd=cwnd+(segize*segsize)/cwnd,在一个RTT里,cwnd最多增加1个报文段。 5. 快速重传和快速恢复: a) 当收到第三个重复的ACK时,将ssthresh设置为当前cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh+3segsize b) 每次收到另一个重复的ACK,cwnd增加1个报文段大小并发送一个分组(如果新的cwnd允许) c) 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh,执行拥塞避免算法。 6. 假设一次连接有16个窗口的数据,那么A,D,ssthresh将被保存在路由表中供下次使用。当建立一个新的连接时,如果该连接将要使用的路由表项已经有了这些度量的值,则用这些值来进行变量的初始化。 7. TCP对ICMP差错的处理: a) 源站抑制使拥塞窗口cwnd被设置为1个报文段并执行慢启动,慢启动门限不变。 b) 主机不可达或网络不可达将被忽略,TCP会执行指数退避方法进行重传。重传时间上限64。最后放弃显示主机不可达,且发送RST。 8. 当TCP超时并重传时,它不一定要重传同样的报文段,相反,TCP允许重新分组发送一个较大的报文段。 9. 当发生拥塞时,采用尾部丢弃原则,丢弃队列拥塞以后到达的分组。假设当网络中有很多TCP连接时,会使许多TCP连接同一时间进入慢开始,我们称之为全局同步,全局同步使得全网通信量突然下降很多,网络正常后通信量又突然增大很多。 a) 解决的办法是采用随机早起检测RED i. 若平均队列长度小于最小门限,则把新到达分组加入队列 ii. 若平均队列长度大于最大门限,则丢弃新分组 iii. 在两者之间就以某一个概率p丢弃分组 ch22 TCP的坚持定时器(零窗口探测) 1.为了防止窗口更新报文段的丢失: 只要TCP连接的一方收到对方零窗口通知,就启动坚持定时器,若持续时间到,就发送一个零窗口探测报文(1字节),而对方就在确认这个报文段给出现在窗口值。如果窗口值仍然是0,收到报文段的一方就重新设置坚持定时器。 3. 糊涂窗口综合征:假设TCP缓存已满,交互式应用程序只从缓存读取1字节,使缓存仅空出1字节,然后向发送方发送确认窗口设置为1字节。就这样来回,网络效率很低。 要解决这个问题,可以让接收方等待一段时间,使得接受缓存有足够空间容纳一个最长的报文段,或者等待接受缓存已有一半空闲的空间。 ch23 TCP的保活定时器 1. 保活定时器的作用是在服务端检测到这种半开放的连接: a) 对端仍然正常运行:最后一次通信的两小时以后定时器复位。 b) 对端已经崩溃:发送10个75s探查仍没响应则认为对端已经关闭连接。 c) 对端已经奔溃并重启:收到对保活探查的响应,这个响应是复位,终止这个连接。 d) 对端无法到达:与状态2相同。