🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
今天是【计算机网络】课程考试前一周时间,趁着计算机网络考试,猫猫来进一步梳理计网这门课程的知识,希望也能给阅读本系列文章的友友们提供一些帮助。
本系列分为两个部分:
- 全面知识梳理
- 特别知识梳理
(全面知识梳理一律加上【第*章】字样,是软件工程所有知识的全面梳理)
(特别知识梳理一律加上 【一篇搞定】字样,仅仅作为特别重要内容的展开延申)
参考书籍🥰:《计算机网络(第5版)》是2012年清华大学出版社出版的图书,作者是Andrew S. Tanenbaum, David J. Wetherall
十二月的猫猫在这里祝愿大家都能在期末考试中取得好成绩,高分拿拿拿!考试过过过!💯
2. 前提回顾
- 进程通信。
- 为端到端连接提供可靠传输服务。
- 偏向于关注程序,应用程序之间的通信。
- TCP服务和UDP服务。
3. 传输层
传输层没有物理设备,因为他们关注的是端口到端口,应用到应用都是软件部分的东西。
传输层重点是UDP协议和TCP协议。
3.1 传输层有哪些功能
3.1.1 传输层功能概述
总体来介绍传输层实现哪些功能:
- 端到端的通信
- 复用和分用
- 差错检测
- 为应用层提供服务
- 网络层是主机和主机之间的通信。
- 逻辑通信:并不是真正建立传输的链路,真正的链路在数据链路层甚至物理层之下。虽然看起来是网络层向网络层的传输,但是本质是使用网络层、数据链路层等的服务完成的。
- 网络层复用和分用针对的是IP数据报的规则:网络层的IP数据报中可能是IP协议数据报、ICMP协议数据报、RIP协议数据报、OSPF协议数据报等,他们都被封装成IP数据报,这就是复用;分用是指将IP数据报重新交付给对应的协议。
- 传输层复用和分用针对的是协议:传输层的复用是指无论什么进程的数据都是用同一个协议(UDP/TCP)去封装数据;分用是指将进程的数据交付给对应的进程。
- 网络层差错检测:检测 首部 部分。
- 传输层差错检测:检测 首部+数据 部分。
3.1.2 传输层协议概述
实现前面提到的传输层功能需要依赖于两个协议:UDP协议 和 TCP协议
- UDP:用户数据报协议,无连接的服务。因此不可靠、时延少,适用于小文件(小文件丢了就丢了再发一次就好了)
- TCP:控制传输协议,有连接的服务。因此可靠、时延大,适用于大文件(大文件就要保证他的正确性,不重新发,这样整体效率更高)。因为有连接,所以不提供广播和多播服务。
- 通信方式:TCP是全双工通信,UDP是交互式通信。双工通信、半双工通信、单工通信等工通信方式都依赖于有一个连接/信道。而UDP仅仅是扔数据包,并没有一个信道。
- 网络游戏:如果我们卡机后,网络恢复正常会把之前的游戏画面都快速走一遍,就说明是TCP协议,因为会把错误的数据重新发送一次;如果我们卡机后,网络恢复正常不会把之前的游戏画面走一遍,而是直接更新到最新游戏状态,就说明是UDP协议(显然王者荣耀是UDP协议,因为卡了后,网络恢复就会看到自己死了)
3.1.3 端口和端口号
端口
- 端口:传输服务访问点;连接应用程序和传输层,标识主机的应用进程;是逻辑上的端口,非物理层,和硬件端口不一样;应用程序通过监听端口获取数据。端口只在当前主机上有意义,各自是分离的,没有关系。
- SAP:网络层的SAP是IP地址;数据链路层SAP是MAC地址
端口号
- 熟知端口号:0-1023【操作系统默认应该具备的应用程序】
- 登记端口号:1024-49151【在专门公司登记后才可以使用,主要给操作系统默认应用程序使用,但是也有一些常见应用程序使用了(如QQ)】
- 短暂端口号:49152-65535 【主要给常见应用程序使用】
套接字
- IP就是主机,也就是我们家的大楼。
- 端口号就是主机中的端口号,也就是我们家大楼中的房间号。
3.2 传输层有哪些通信的方式
3.2.1 UDP协议
3.2.1.1 UDP协议与UDP数据报
UDP协议的特点:如下图
UDP数据报:UDP协议下传输的数据;UDP数据报包装在IP数据报中(这也就是为什么只能适用于小文件传输)。如下图:
UDP数据报特点:相比于IP数据报多了复用、分用和差错检测功能。
UDP数据报格式:
- 数据报长度:首部+数据量
- 源端口号 和 校验和 都可以为0
- 如果目的端口号找不到,则会发送ICMP差错报文给发送方
3.2.1.2 UDP校验
UDP校验步骤
- 全0填充数据部分:数据部分没有填满,为了满足格式要求,填充0。
- 伪首部:IP数据报的首部(源IP地址、目的IP地址、版本号、UDP长度)
- 生成校验码:伪首部、首部、数据部分按照16bit一组,分成许多组。然后彼此求和,并取反码。
- 去掉伪首部:发送的UDP数据报中不含有伪首部(伪首部是个舔狗)
- UDP长度:UDP首部8B+数据部分长度(不包括填充的0)
伪首部
求和流程
假如伪首部如下:
16bit分组如下:
求和并求反码如下:
3.2.2 TCP协议
TCP协议:传输控制协议
3.2.2.1 TCP协议特点
- 面向连接(虚连接)的传输协议。(虚连接不是一个物理上的电路,而是两方都记录下关于本次连接的详细信息,包括连接方、连接时间等信息)
- 每一条TCP连接只能有两个端点:点对点。(两者地位相同,没有固定的发送方和接收方)
- 提供可靠交付服务。(可靠有序,不丢不重)
- 无差错、不丢、不重复、按序到达。(不是不出错,是出错会采取措施弥补)
- 提供全双工通信:发送缓存、接收缓存。
- 面向字节流:以字节为单位,像水流一样去传输。
3.2.2.2 TCP报文段
- 应用层传输:报文
- 传输层传输:报文段
- 报文段在TCP中叫报文段,在UDP中叫用户数据报。没有本质区别。
- 源端口和目的端口
- 序号:本报文段所发送数据的第一个字节的序号(每一个字节都有一个序号,报文段的序号就是第一个字节的序号)
- 确认号:期望收到下一个报文段第一个字节的序号。(类似于前面的累计确认ack)
- 数据偏移:即首部长度,报文段数据与报文段起始的距离。(4位,以4B为单位)
- 紧急位URG:为1时有紧急数据,优先级高,配合紧急指针使用。
- 确认位ACK:为1时确认号有效,连接后报文段必须把ACK置为1。(连接建立前所发送的报文段的确认号是无效的)
- 推送位PSH:为1时接收方尽快交付,不需要等缓存满。(紧急位是要发送方紧急去发送处理;推送位是push接收方尽快接受不用缓存)
- 复位RST:为1时TCP连接错误,须释放后重连。
- 同步位SYN:为1时表明连接请求/连接接受报文。
- 终止位FIN:为1时此报文段已发完,要求释放连接。
- 窗口:发送方的接收窗口,允许对方发送的数据量。(全双工:发送方和接收方都有发送窗口和接收窗口)
- 检验和:检验首部+数据,要加上12B伪首部,第4个字段为6(TCP是6,UDP是17)(和UDP检验类似)
- 紧急指针:URG为1时才有意义,本报文段是紧急数据字节数。
- 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认等。
3.2.2.3 TCP连接的建立和释放
TCP完整流程:建立连接——传送数据——释放连接
连接建立
- TCP连接本质:双方维护彼此连接的信息。连接的信息就是彼此的套接字实体。
- 客户/服务模式:主动发起连接的进程叫客户;被动等待连接建立的进程叫服务器。
- 建立连接:依赖三次握手协议、
三次握手(本质是一次握手三次摇动):
- 客户机向服务器发送一个连接请求报文段(不包含数据,SYN=1,ACK=0,seq=x)(服务器一般始终处于监听状态)。
- 服务器同意连接,分配缓存和变量,向客户机发回确认。(SYN=1,ACK=1,seq=y,ack=x+1)(ACK是确认位,ack是具体的确认号,表示对ack之前的seq的信息的确认)
- 客户机收到确认报文段,分配缓存和变量,向服务器给出确认。(建立对应的套接字实体,同时告诉服务器,自己确认了)
- 第一次连接请求:找娘家提婚
- 第二次回复确认:娘家同意结婚
- 第三次回复确认:给出彩礼(可以带上数据)去真正确认结婚
连接释放
四次挥手:
- 客户机发送连接释放报文段,停发数据,主动关闭连接。
- 服务器回复确认报文段,客户到服务器方向已经释放。
- 服务器发送释放连接报文段,主动关闭连接。
- 客户端回复确认报文段,等待2MSL(两次最大报文段生存时间)后彻底关闭。(等待2MSL是因为防止客户端的回复没有被收到,让服务器可以重新发送一次,这样子一去一回正好2MSL)
- 第一次发送停发:渣男要分手,说了之后就开始第一次难过进入第一分手状态,这次还有点觉得对不起女生。
- 第二次回复停发:女生收到消息,生气把之前的礼物都发回去,男生收到礼物一点愧疚感都没有了,进入第二分手状态。但是仍然恋恋不忘发消息。
- 第三次停发确认:男生一直不回消息,女生也想明白了,最后发一个停发确认,确定分手
- 第四次回复停发:男生收到女生的分手消息,马上同意分手,等待2MSL就关闭,女生收到男生的确认信息,也关闭。
建立连接:1、2次握手带着SYN=1
释放连接:1、3次挥手带着FIN=1
3.2.2.4 TCP可靠传输
可靠传输:确认机制+重传机制
可靠传输:确保接收与发送的内容和顺序一致(可靠有序,不丢不重)
网络层:尽最大努力交付,不可靠传输
传输层:使用TCP实现可靠传输
- 校验:与UDP一样。
- 序号:报文段第一个字节的序号,每个字节一个序号。
- 确认:期望收到的下一个报文段第一个字节的序号,累计确认。(接收不一定是有序的,但是回复确认一定是有序的,依靠缓存来实现)
- 重传:超时重传(因为传输层的报文段传输时间会比较长,因此这个超时重传中的超时设置时间会比较长,因此重传时间浪费很久);冗余ACK重传(传输层适用于这种)(冗余3次ACK也就是收到4次ACK则重传)。
超时重传和冗余ACK重传是同时存在的
3.2.2.5 TCP流量控制
流量控制是在前面的可靠传输基础上进行的
滑动窗口机制:在发送端控制流量,以便接收端正常接收
一句话:接收方根据自己接收缓存大小动态调整发送方窗口大小
- 接收窗口rwnd设置确认报文段的窗口字段,并通知发送方。
- 发送方收取窗口rwnd和拥塞窗口cwnd比较,选择较少值。
- 连接建立后A向B发送数据,B告诉A自己的rwnd大小(B每次都会重复告诉A自己的rwnd)。
- TCP为连接设置持续计时器,收到零窗口通知则启动。
- 持续计时器到期则发送零窗口探测报文段,请求目前窗口值。
接受窗口:窗口满了之后会向后滑动
发送窗口:收到对应的ack才会移动窗口
3.2.2.6 TCP拥塞控制
拥塞控制:关注网络、路由器、链路等网络结构不过载(网络全局结构)
流量控制:关注两个主机(进程)之间的情况(端到端)
拥塞控制:防止过多数据注入网络,保证路由器和链路不过载
产生条件:主机想要传输数据,但是需求>可用资源
发展过程:资源供应不足——时延增加——吞吐量下降
- 传输轮次:开始发送两批报文段的时间间隔;发送一批报文段并收到他们确认的时间。
- 拥塞窗口:发送方根据拥塞程度设置,反映网络当前容量。
- 接收窗口:接收方将接收窗口告诉发送方
- 发送窗口大小:拥塞窗口与接收窗口大小的最小值
阈值、增长速度等单位都是MSS,只是这边MSS=1才有上面的图片
慢开始算法
慢开始指的是从很少的报文段开始增加
发送方维持一个叫做拥塞窗口cwnd
的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如果还考虑接收方的接受能力,那么发送窗口还可能小于拥塞窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减少一些,以减少注入到网络中的分组数。
慢开始算法的思路:当主机开始发送数据时,如果立即把大量数据字节注入到网络中,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。经验证明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加之多一个MSS的数值,用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍
传输轮次:一个传输轮次所经历的时间其实就是往返时间RTT
。把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。
慢开始门限ssthresh:
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量.
当cwnd < ssthresh 时,使用慢开始算法。
当cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd = ssthresh 时,即可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免算法
拥塞避免算法的思路:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢的多。
无论在慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(没有按时收到确认),就要把慢开始门限ssthresh
设置为出现拥塞时发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1
,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完。
对慢开始算法和拥塞避免算法的补充
快重传算法
快重传算法首先要求接收方每收到一个失序的报文段就立即发出重复确认(为的是使发送方及早的知道有报文段没有到达对方)而不要等到自己发送数据时才捎带确认。
快重传算法规定,发送方只要连续收到三个重复确认
就应当立即重传对方尚未收到的报文段
,而不必继续等待为其设置的重传计时器到期。
快恢复算法
(1)当发送方连续收到三个重复确认
时,就执行“乘法减小”
算法,把慢开始门限减半。这是为了预防网络发生拥塞,但不执行慢开始算法
。
(2)由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重拥塞,就不会一连有好几个报文段连续到达接收方,也就不会导致接收方连续发送重复确认)。因此与慢开始不同之处就是现在不执行慢开始算法(即拥塞窗口现在不设置为1)而是把拥塞窗口的值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
注意:有的快重传实现是把开始时的拥塞窗口cwnd值再增大一些(增大3个报文段),即等于ssthresh + 3*MSS 这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络资源而是停留在接收方的缓存中。可见现在网络中并不是堆积了分组而是减少了三个分组。因此可以适当把拥塞窗口扩大些。
当采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络超时时才使用。
实际上接收方的缓存空间总是有限的,接收方根据自己的接收能力设定了接收窗口rwnd,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方。因此,从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收窗口值rwnd.那么,发送方的窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个。发送方窗口的上限值 = Min [rwnd ,cwnd]
当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值
当rwnd > cwnd 时,则是网络的拥塞限制发送方窗口的最大值
注意:
- TCP拥塞控制有四个算法:慢开始、拥塞避免、快重传和快恢复。
- 四个算法不是互斥的,而是同时存在一起使用的。
4. 总结
本文到这里就结束啦~~
目前已完成:
【计算机网络】第三章·数据链路层与局域网/广域网-CSDN博客
期待您的关注~~🥰🥰
猫猫陪你永远在路上💪💪
如果觉得对你有帮助,辛苦友友点个赞哦~