《TCP/IP详解卷一》学习笔记

第1章 概述

1、以太网数据帧的物理特性是其长度必须在46-1500字节之间;

第3章 IP:网际协议

1、IP提供不可靠、无连接的数据报传送服务;不可靠的意思是它不能保证I P数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端?。无连接这个术语的意思是I P并不维护任何关于后续数据报的状态信息。
在这里插入图片描述

2、如果首部校验和失败,则IP层会丢弃该数据报,但是不产生差错报文,由上层去发现丢失的数据报并进行重传。
3、IP层允许报文丢失、失序、重复;
3、IP路由选择
在这里插入图片描述

第6章 ICMP:internet控制报文协议

0、ICMP基于IP数据报
1、ICMP回显应答报文;
2、ICMP差错报告报文;
1)ICMP端口不可达差错(ICMP目的不可达报文的一种)
注:UDP的规则之一是,如果收到一份U D P数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。
注:ICMP的一个规则是, ICMP差错报文(参见图6 - 3的最后一列)必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。
注:使用UDP网络编程时,使用connect时,可以收到ICMP差错报文;
在这里插入图片描述

第7/8章 Ping/Traceroute程序

1、 Ping使用ICMP回显请求和回显应答报文;
2、 Traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期);
注:Traceroute的实现为UDP+2种ICMP报文(TTL超时与端口不可达);Tracert的实现为2种ICMP报文(TTL超时与回送请求报文);
在这里插入图片描述

3、Traceroute程序发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口
号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的UDP模块产生一份ICMP端口不可达错误报文。
3、Traceroute原理:开始时发送一个TTL字段为1的UDP数据报,然后将TTL字段每次加1,以确定路径中的每个路由器。每个路由器在丢弃UDP数据报时都返回一个ICMP超时报文2,而最终目的主机则产生一个ICMP端口不可达的报文。
注:Traceroute每发送一个报文,其路径可能会变化;

第9/10章 IP路由

1、IGP之RIP路由(基于距离向量)——基于UDP,使用端口号520
2、IGP之OSPF最短路径优先(基于链路状态)——直接使用IP
在一个链路状态协议中,路由器并不与其邻站交换距离信息。它采用的是每个路由器主动地测试与其邻站相连链路的状态,将这些信息发送给它的其他邻站,而邻站将这些信息在自治系统中传播出去。每个路由器接收这些链路状态信息,并建立起完整的路由表。
在这里插入图片描述

3、 EGP之BGP:边界网关协议——基于TCP
BGP系统与其他BGP系统之间交换网络可到达信息。这些信息包括数据到达这些网络所必须经过的自治系统AS中的所有路径。这些信息足以构造一幅自治系统连接图。然后,可以根据连接图删除选路环,制订选路策略。
BGP是一个距离向量协议,但是与(通告到目的地址跳数的)RIP不同的是,BGP列举了到每个目的地址的路由(自治系统到达目的地址的序列号)。
BGP通过定期发送keepalive报文给其邻站来检测TCP连接对端的链路或主机失败。

第11章 UDP: 用户数据包协议

1、UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。
在这里插入图片描述

2、UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是OK)。
2、UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。
注:UDP校验和:12字节UDP伪首部+UDP首部+数据(必要会填充0,但这些填充字节只是为了计算,不会传输);对于TCP校验和类似;
4、 IP分片
1) IP分片可以发生在发送端,也可以发生在中间路由器;已经分片的IP数据报,可能还需要分片;
2) 一份IP数据报分片以后,只有达到目的地才进行重新组装;(由目的端的IP层完成);
3) 当IP分片的数据报在目的端失序时,会进行正确重组;
4) 当IP分片中某一个数据报丢失,会导致整个IP报丢失(在TCP中,导致重传整个数据报;在UDP中,UDP数据报丢失);这主要是因为IP层提供不可靠的传输,没有超时重传等机制;
注:因此,要尽量避免分片;此外分片也会使得网络实际传输的数据变得更大;(需要更多的头部)
5)在第一个数据报片出现时,IP层必须启动一个定时器。这里“第一个”表示给定数据报的第一个到达数据报片,而不是第一个数据报片(数据报片偏移为0)。正常的定时器值为30或60秒。如果定时器超时而该数据报的所有数据报片未能全部到达,那么将这些数据报片丢弃。
5、一般要求主机必须能够接收最短为576字节的IP数据报;因此实际UDP长度大多会小于568字节;
6、数据报截断
7、应用程序并不知道其输入队列何时溢出。只是由UDP对超出数据报进行丢弃处理。没有发回任何信息告诉客户其数据报被丢弃。

第12章 多播和广播

1、 广播的问题:增加了对广播数据不感兴趣主机的处理负荷;而多播的出现减少对应用不感兴趣主机的处理负荷。(网卡可以获悉该主机属于哪个多播组,然后仅接收主机所在多播组的那些多播帧)
在这里插入图片描述

第14章 DNS:域名系统

1、 DNS的一个基本特性是使用超高速缓存;
2、 DNS询问报文,有两种:递归和迭代;
3、 DNS使用的熟知端口号无论对UDP还是TCP都是53.
注:在查询应答时采用UDP,如果报文太长,改用TCP;对于主DNS和辅助DNS之间使用TCP进行传输(定时更新);
在这里插入图片描述

第15章 TFTP:简单文件传送协议

1、 TFTP采用不可靠的UDP,因此TFTP必须处理分组丢失和分组重复;
注:分组丢失:超时重传;分组重复:序号;
2、 TFTP没有提供安全特性;

第17章 TCP:传输控制协议

在这里插入图片描述
在这里插入图片描述
1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变,仅仅会由IP进行分片。由TCP传递给IP的信息单位称为报文段或段;
在这里插入图片描述

2、当建立一个新的连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号。
3、确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有ACK标志为1时,确认序号字段才有效。
4、TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始
于确认序号字段指明的值,这个值是接收端正期望接收的字节。
5、TCP校验和:TCP伪首部+TCP首部+TCP数据部分;
6、只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
7、最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方
通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。发端将不接收超过这个长度的TCP报文段。这通常是为了避免分段。
8、在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
9、TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据
进行确认,对失序的数据重新排序,丢弃重复数据; TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。

第18章 TCP连接建立与终止

1、当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,
因此每个连接都将具有不同的ISN。RFC 793 [Postel 1981c]指出ISN可看作是一个32比特的计数器,每4ms加1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。
2、收到一个FIN只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。
3、最大报文段长度MSS表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。如果一方不接收来自另一方的MSS值,则MSS就定为默认值536字节(这个默认值允许20字节的IP首部和2 0字节的T C P首部以适合576字节IP数据报)。
4、可将MSS值设置为外出接口上的MTU长度减去固定的I P首部和TCP首部长度;
5、MSS让主机限制另一端发送数据报的长度。加上主机也能控制它发送数据报的长度,这
将使以较小MTU连接到一个网络上的主机避免分段。
6、TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力
在这里插入图片描述

7、TIME_WAIT中的2MSL等待状态,MSL为一个报文段最大生存时间;MSL规定为2分钟,但常用为30s,1m,2m;
8、在连接处于2MSL等待时,任何迟到的报文段将被丢弃。因为处于2MSL等待的、由该socket pair定义的连接在这段时间内不能被再用;但一般会更加严格,使得处于2MSL等待的本地端口不能重用,除非设置SO_REUSEADDR,使得本端口可用,但这个处于2MSL的socket pair连接依然是不可用的;
9、为了防止这种情况,RFC 793指出TCP在重启动后的MSL秒内不能建立任何连接。这就称为平静时间(quiet time)。(一般会违反?)
10、一般说来,无论何时一个报文段发往基准的连接出现错误, TCP都会发出一个复位报文段(这里提到的“基准的连接”是指由目的IP地址和目的端口号以及源I P地址和源端口号指明的连接。)
1)到不存在的端口的连接请求
对于UDP,产生ICMP端口不可达;对于TCP,产生RST报文;
2)异常终止一个连接(可以使用Linger)
异常终止一个连接对应用程序来说有两个优点:(1)丢弃任何待发数据并立即发送复位
报文段;(2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭。应用程序使用的A P I必须提供产生异常关闭而不是正常关闭的手段。
注:RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接,并通知应用层连接复位。
3)检测半打开连接
如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的TCP连接称为半打开Half-Open的。任何一端的主机异常都可能导致发生这种情况。只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。
半打开连接的另一个常见原因是当客户主机突然掉电而不是正常的结束客户应用程序后再关机。
有这么两种情况:A.在半打开状态,发送数据,多次重传之后,发送RST,关闭连接;B.在半打开状态,对端下线后又重新上线,这时候再发送数据给对端,对端会发送RST.
注:收到RST后,socket会返回什么?
注:读一个收到RST的socket返回-1,并且设置errno为ECONNRESET;
注:当socket收到RST后,第一次read或者write,会收到ECONNRESET错误,再次write的时候,会引起SIGPIPE信号(而再次read的时候,返回0?);
参考:http://www.bubuko.com/infodetail-766481.html
11、同时打开
在这里插入图片描述

12、同时关闭
在这里插入图片描述

13、处于TCP已连接队列中的TCP连接,如果客户端发送数据,会将接收到的数据放入接收缓冲队列中;
14、如果TCP已连接队列已满,这时候TCP将不会理睬SYN,也不发送任何报文段(即不发回RST)。
注:发送SYN的一端,会等一段时间重新发送;这主要是TCP已连接队列满是软错误,而不是硬错误,也许再试一次,就成功了,如果多次不成功,应该就是直接关闭了。
15、一个TCP连接由一个4元组唯一确定:本地IP地址、本地端口号、远端IP地址和远端端口号。
16、处于TIME_WAIT的一段,重复的FIN会得到确认,2MSL定时器重新开始。
17、在TIME WAIT状态中收到一个RST引起状态过早地终止。

第19章 TCP的交互数据流

1、 交互数据总是以小于最大报文段长度的分组发送。导致网络利用率低下。
2、 接收端:延时确认; (在一定时间内有数据发送,就捎带ACK)
3、 发送端:Nagle算法;
要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反, TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去;

第20章 TCP成块数据流

1、累积确认;(通常使用的“隔一个报文段确认”的策略)
注:存在定时器;
注:当返回0窗口确认报文时,当该接收窗口空闲空间变大时,会再发送一个携带接收窗口长度的确认报文,以更新窗口;——但是这个ACK可能会丢失,因此依然需要坚持定时器
注:许多TCP实现在窗口大小增加了两个最大报文段长度或者最大可能窗口的50%时发送这个窗口更新;
2、延迟确认:通常TCP在收到数据的时候不会立刻发送一个ACK确认,它会延迟发送,可以和对方需要的数据一起发送(数据捎带ACK)或者是等待第二个数据来了直接回复第二个ACK,通常的实现采用的延迟是200ms(就是说它会等待200ms有没有数据一起发送)
2、滑动窗口
窗口的大小是相对于确认序号的。
3、发送方使用PSH标志通知接收方将所收到的数据全部提交给接收进程。
4、慢开始
发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
5、TCP提供了“紧急方式( urgent mode) ”,它使一端可以告诉另一端有些具有某种方式的
“紧急数据”已经放置在普通的数据流中。另一端被通知这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。
在这里插入图片描述
注:即使发送窗口为0,依然可以发送URG+ACK空报文;(而且处于URG状态,每一次调用输出操作,都会触发URG,如果是发送窗口为0,则发送URG+ACK空报文)
注:TCP的紧急方式只是一个从发送方到接收方的通知,该通知告诉接收方紧急数据已被发送,并提供该数据最后一个字节的序号。

第21章 TCP的超时与重传

1、TCP4种定时器
在这里插入图片描述

2、超 时重传
多次重传后(重传时间为指数退避),发送RST关闭连接;
3、大多数源于伯克利的TCP实现在任何时候对每个连接仅测量一次RTT值。
4、快重传:连续3次收到重复确认,则重传;
注:当接收方,收到失序的包时,会保存这些数据,并产生重复ACK;当收到失序包时,会进行正常的ACK;
注:在收到一个失序的报文段时,TCP立即需要产生一个ACK(一个重复的ACK)。这个重复的ACK不应该被迟延。该重复的ACK的目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。
注:快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。根据 TCP 不同的实现,以上两种情况都是有可能的。而SACK则是只重传丢失的数据(告诉对端自己受到了那些包)。D-SACK则是使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。D-SACK 优点:可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;可以知道是不是「发送方」的数据包被网络延迟了;可以知道网络中是不是把「发送方」的数据包给复制了。
5、慢开始:初始设置cwnd为1个报文段,此后每收到一个确认就加1。因此是指数增长;而拥塞避免,则是要求每次收到一个确认时将cwnd增加1 cwnd。与慢启动的指数增加比起来,这是一种加性增长(additive increase)。我们希望在一个往返时间内最多为cwnd增加1个报文段(不管在这个RTT中收到了多少个ACK),然而慢启动将根据这个往返时间中所收到的确认的个数增加cwnd。
在这里插入图片描述

6、快重传与快恢复
连续3次收到重复确认,则重传失序包,并进行快恢复;
注:重复的A C K的目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。
注:由于我们不知道一个重复的ACK是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的ACK到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只可能产生1 ~ 2个重复的ACK。如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。
注:在这种情况下没有执行慢启动的原因是由于收到重复的ACK不仅仅告诉我们一个分组丢失了。由于接收方只有在收到另一个报文段时才会产生重复的ACK,而该报文段已经离开了网络并进入了接收方的缓存。也就是说,在收发两端之间仍然有流动的数据,而我们不想执行慢启动来突然减少数据流。
在这里插入图片描述

快重传和慢开始原理:
1) 收到连续3次的重复确认,则将ssthresh设置为cwnd/2,并且重传失序包。而cwnd则是再加上3个报文段;
2) 之后被收到一个重复ACK,则cwnd++;
3) 最后,收到新数据的ACK,则cwnd设置为ssthresh
注:每次DUP ACK,你还能去发送新的数据;避免中间长时间被浪费。
7、重新分组
当TCP超时并重传时,它不一定要重传同样的报文段。相反, TCP允许进行重新分组而发送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声明的MSS)。在协议中这是允许的,因为TCP是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认。

第22章 TCP的持续定时器

1、 持续定时器使用了普通的TCP指数退避,但是总是在5-60s内。
2、 0窗口探测报文包含一个字节的数据。(TCP总是允许在关闭连接前发送一个字节的数据);尽管如此,锁返回的窗口为0的ACK并不是确认该字节,因此这个字节被持续重传;
3、 坚持状态与超时重传不同点在于TCP从不放弃发送窗口探测;
4、 糊涂窗口综合症:少量的数据通过连接进行交换,而不是满长度的报文段;
在这里插入图片描述

发送端:延迟确认;只有在窗口空闲一定长度时,才发送更新窗口值;
发送端:Nagle、Cork;

第23章 TCP的保活定时器

在这里插入图片描述
注:主机关闭时,一般会发送FIN;而主机崩溃时,则什么都不发送;
注:保活包,有服务器和客户端双向开启;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值