计算机网络必看之·你确定了解传输层吗?
Posted kikokingzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络必看之·你确定了解传输层吗?相关的知识,希望对你有一定的参考价值。
🌕写在前面
- 🍊博客主页:kikoking的江湖背景
- 🎉欢迎关注🔎点赞👍收藏⭐️留言📝
- 🌟本文由 kikokingzz 原创,CSDN首发!
- 📆首发时间:🌹2021年12月12日🌹
- 🆕最新更新时间:🎄2021年12月12日🎄
- ✉️坚持和努力一定能换来诗与远方!
- 🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢感谢感谢!
目录
🔥1.传输层的功能
🍊1·传输层提供进程间的逻辑通信(即端到端通信)
·网络层:提供的是主机之间的通信
逻辑通信:传输层之间的通信好像是沿水平方向传送数据,但事实上这两个传输层之间并没有一条水平方向的物理连接;具体来说传输层向高层用户屏蔽了低层网络核心的细节(例如网络拓扑、路由协议),使应用进程看见的好像是在两个传输层实体之间有一条端到端的逻辑通信信道。
🍊2·复用分用
🌟1.什么是复用分用?
A1:我们举一个通俗的写信例子,考虑有两家人,一家住在城南,一家住在城东,每家都有20多个孩子,他们互相写信,城南的家庭的所有信件由 kikoking 负责收发,城东的家庭的所有信件收发由 mrlx 进行,他们负责收集家里的信件然后交付给邮政服务传送。
在上述这个例子中 kikoing 和 mrlx 就好比是Socket,邮政服务为两个家庭提供逻辑通信,看似信件是由两家人互相寄出的,而其实是通过邮政服务(传输层以下的服务)传递的。
其中每一个孩子通过他们的姓名来标识,当kikoking收到邮政服务的信件后,通过查看收件人名字而将信件亲手交付给他的兄弟姐妹,这执行的是多路分解操作
当mrlx从兄弟姐妹那收集信件,并将它们交给邮递员时,他执行的是多路复用操作
🌟2.如何实现多路分用?
🌟3.无连接的多路复用与分解
当报文段从主机A和主机B到达主机C时,主机C的传输层检查报文段中的目的端口号(6428),并将其定向到相应的套接字(6428),然后报文段中的数据通过套接字进入其所连接的进程
🌟4.面向连接的多路复用与分解
如上图,主机主机C向主机B发起了两个HTTP会话,主机A向主机B发起了一个HTTP会话
尽管主机A和主机C的源端口号相同,但是对于服务器B来说依旧能够正确地分解这两个具有相同源端口号的连接,因为这两条连接有不同的源IP地址。
🌟5.套接字与线程
当今高性能的Web服务器通常只使用一个进程,但为每个客户新的连接创造一个新的线程(线程相当于一个轻量级的子进程)
🌟6.HTTP与套接字的关系
如果客户与服务器使用非持续HTTP,则对每一对请求/响应都创建一个新的TCP连接并在随后关闭,因此对每一对请求/响应创建一个新的套接字并在随后关闭。这种套接字的频繁创建和关闭会严重影响一个繁忙的Web服务器的性能。
如果客户使用持续HTTP,则在整条连接持续期间,客户与服务器之间经由同一个服务器套接字交换HTTP报文。
🍊3·差错检测
·传输层对收到的报文(首部和数据部分)进行差错检测
·网络层只检查IP数据报的首部,不检查数据部分是否出错
🍊4·提供两种不同的传输协议
·面向连接的TCP和无连接的UDP;而网络层无法同时实现这两种协议
网络层提供面向连接的服务——虚电路
网络层提供无连接服务——数据报
不可能在网络层同时出现这两种方式!
✨✨✨我是分割线✨✨✨
🔥2.传输层的寻址与端口
🍊2.1 端口的作用
1.是传输层的服务访问点
2.能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据通过端口交付给应用层相应的进程
3.是软件端口——应用层的各种协议进程与传输实体进行层间交互的一种地址
对比·硬件端口:不同硬件设备进行交互的接口
🍊2.2 端口号
·应用进程通过端口号进行标识,端口号长度为16bit,能够表示65536个不同的端口号
应用程序 FTP TELNET SMTP DNS TFTP HTTP POP 熟知端口号 21 23 25 53 69 80 110 🍊2.3 套接字
网络中通过IP地址来标识和区分不同的主机,通过端口号来标识和区分一台主机中的不同应用进程,端口号拼接到IP地址即构成套接字Socket。在网络中采用发送方和接收方的套接字来识别端点。
套接字Socket=(IP地址:端口号);它唯一标识网络中的一台主机上的一个应用进程
✨✨✨我是分割线✨✨✨
🔥3.UDP协议
🍊3.1 UDP的概念
1.与IP的区别:UDP在IP数据报服务之上增加了两个最基本的服务:复用和分用 + 差错检测
2.常用于一次性传输较少数据的网络应用,如DNS 、SNMP等
因为对于这些应用,若采用TCP,则将为连接创建、维护、拆除带来不小的开销
3.常用于多媒体应用(IP电话、视频会议、流媒体等)
因为可靠传输对于这些应用来说不是最重要的,TCP的拥塞控制会导致数据出现较大的延迟,这是大忌!
4.不保证可靠交付,但并不意味着应用对数据的要求是不可靠的,所有维护可靠性的工作可由用户在应用层完成
5.UDP是面向报文的,报文不可分割,报文是UDP数据报处理的最小单位
🍊3.2 UDP的优点
1.无需建立连接,不会引入建立连接的时延
·DNS如果运行在TCP上,速度会慢很多;因此使用UDP
·HTTP使用TCP是因为对于基于文本数据的web网页,可靠性是至关重要的
2.无连接状态,不维护连接状态,一般能支持更多的活动客户机
·TCP需要在端系统中维护连接状态(包括接收和发送缓存、拥塞控制参数和序号与确认号的参数)
3.分组首部开销小
·TCP有20B的首部开销,UDP有8B的开销
4.没有拥塞控制,应用层能更好地控制要发送的数据和发送时间
·UDP没有拥塞控制,因此网络中的拥塞不会影响主机的发送效率
5.支持一对一、一对多、多对一和多对多的交互通信
🍊3.3 UDP的首部格式
UDP数据报包含两部分:UDP首部和用户数据
UDP首部(8B),由4个字段组成,每个字段长度为2B
1.源端口号:在需要对方回信时选用,不需要时全0
2.目的端口号:这在终点交付报文时必须使用到
3.UDP长度(8B):UDP数据报的长度(包括首部和数据),其最小值是8(仅有首部)\\
4.校验和:检测UDP数据报中是否有错,有错就丢弃。该字段可选,不使用时全0
当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口上交给应用进程,如图5.3所示
如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于端口号的应用进程),那么就丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方
🍊3.4 UDP校验
在计算校验和时,要在UDP数据报之前增加12B的伪首部,伪首部并不是UDP的真正首部,只是在计算校验和时,临时添加在UDP数据报的前面,得到一个临时的UDP数据报
UDP校验和检查首部和数据部分,而IP校验和只检查数据报的首部
🌟伪首部的特点
1.长度为12B
2.伪首部不是UDP的真正首部,只在计算校验和时用到
3.伪首部既不向下传送也不向上递交,只是为了计算校验和
🌟UDP校验方法
1.发送方首先把全零放入校验和字段并添加伪首部,然后把UDP数据报视为许多16位的字连接起来。
2.若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(但此字节不发送)。
3.接下来按二进制反码计算出这些16位字的和,并将此和的二进制反码写入校验和字段。
4.接收方把收到的UDP数据报加上伪首部(如果不为偶数个字节,那么还需要补上全零字节)后,按二进制反码计算出这些16位字的和。
5.当无差错时其结果应全为1,否则表明有差错出现,接收方就应该丢弃这个UDP数据报。
实例1.
注意:
1)校验时,若UDP数据报部分的长度不是偶数个字节,则需填入一个全0字节,如图5.5 所示。但是此字节和伪首部一样,是不发送的。
2)通过伪首部,不仅可以检查源端口号、目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。
这种简单的差错检验方法的检错能力并不强,但它的好处是简单、处理速度快。
✨✨✨我是分割线✨✨✨
🔥4.TCP协议
🍊4.1 TCP协议的特点
1.TCP是面向连接的传输层协议
2.每条TCP连接只能有两个端点,每条TCP连接只能是点对点的(一对一)
3.TCP提供可靠的交付服务,保证传送的数据无差错、不丢失、不重要且有序
4.TCP是面向字节流的
5.TCP提供全双工通信,允许双方在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据
🍓发送缓存
发送缓存用来暂存以下数据:
1.发送应用程序传送给发送方TCP准备发送的数据
2.TCP已发送但尚未收到确认的数据
🍓接收缓存
接收缓存用来暂存以下数据:
1.按序到达但尚未被接收应用程序读取的数据
2.不按序到达的数据
虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅视为一连串的无结构的字节流。
注意:TCP和UDP在发送报文时所采用的方式完全不同。UDP报文的长度由发送应用进程决定,而TCP报文的长度则根据接收方给出的窗口值和当前网络拥塞程度来决定。如果应用进程传送到TCP缓存的数据块太长,TCP就把它划分得短一些再传送;如果太短,TCP也可以等到积累足够多的字节后再组成报文段发送出去
🍊4.2 TCP报文段
1.TCP传送的数据单元称为报文段
2.TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答
3.一个TCP报文段分为首部和数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中
1.源端口和目的端口(2B/2B):端口是运输层与应用层的服务接口;运输层的多路复用/分用都要通过端口实现
2.序号(4B): 范围0~ :TCP是面向字节流的,所以TCP连接传送的字节流中的每个字节都按顺序编号,序号字段的值是指本报文段所发送的数据的第一个字节的序号
例如,一报文段的序号字段值是301,而携带的数据共有100B,表明本报文段的数据的最后一个字节的序号是400,因此下一个报文段的数据序号应从401开始。
3.确认号(4B):是期望收到对方下一个报文段的第一个数据字节的序号,若确认号为N,则表明到序号N-1为止的所有数据都已正确收到
例如,B正确收到了A发送过来的一个报文段,其序号字段是501,而数据长度是200B(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
4.数据偏移(占4位):即首部长度,这里不是IP数据报分片的那个数据偏移,而是表示首部长度(首部中还有长度不确定的选项字段),它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
数据偏移”的单位是32位(以4B为计算单位)。因此当此字段的值为15时,达到TCP首部的最大长度60B。
5. 保留(占6位): 保留为今后使用,但目前应置为0。
6.紧急位URG(占1位):URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据。但URG需要和紧急指针配合使用,即数据从第一个字节到紧急指针所指字节就是紧急数据。
7.确认位ACK(占1位):仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
8.推送位PSH(占1位):接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付。
9.复位位RST(占1位):RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
10.同步位SYN(占1位):同步SYN=1表示这是一个连接请求或连接接受报文。
当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使用SYN=1,ACK=1。
11.终止位FIN(占1位):用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。
12.窗口(占2B):范围为0~ 。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据。
例如,设确认号是701,窗口字段是1000。这表明,从701号算起,发送此报文段的一方还有接收1000字节数据(字节序号为701~1700)的接收缓存空间。
13.校验和(占2B):校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的第4个字段,即协议字段的17改成6,其他的和UDP一样)
14.紧急指针(占2B):紧急指针仅在URG=1时才有意义,它指出在本报文段中紧急数据共有多少字节(紧急数据在报文段数据的最前面)。
15.选项(长度可变):TC最初只规定了一种选项,即最大报文段长度(Maximum Segment Size,MSS)。MSS是TCP报文段中的数据字段的最大长度(注意仅仅是数据字段)。
16.填充:这是为了使整个首部长度是4B的整数倍。
📜习题检测
解:由TCP首部信息可知
(1)源端口号(2B):0x0D28 目的端口(2B):0x0015
(2)序号占(4B):0x505F A906 确认号(4B):0x0000 0000
(3)TCP首部长度: 0x7 -----> 7*4=28字节
(4)目的端口:5+16=21 使用FTP协议的TCP连接 SYN=1、ACK=0 表示这是一个连接请求报文
🍊4.3 TCP连接管理
·在TCP连接建立的过程中,要解决以下三个问题:
1)要使每一方能够确知对方的存在。
2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)。
3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
·TCP连接的端口即为套接字(socket)或插口,每条TCP连接唯一地被通信的两个端点(即两个套接字)确定。
·TCP连接的建立采用客户/服务器方式。主动发起连接建立的应用进程称为客户(Client),而被动等待连接建立的应用进程称为服务器(Server)。
🍓TCP连接建立·三次握手
·特别注意:服务端资源是在完成第二次握手时分配的,而客户端资源是在完成第三次握手时分配的,这就容易使得服务器易于收到SYN洪泛攻击
🍓TCP连接的释放·4次握手
🍊4.4 TCP可靠传输
Q:TCP是如何实现可靠传输的呢?
A:TCP使用校验、序号、确认和重传等机制来达到这一目的
🍓序号机制
TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值是指本报文段所发送的数据的第一个字节的序号。
如图5.9所示,假设A和B之间建立了一条TCP连接,A的发送缓存区中共有10B,序号从0开始标号,第一个报文包含0~2,则该TCP报文段的序号为0,第二个报文段的序号是3。
🍓确认机制
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号.在图5.9中,如果接收方B已收到第一个报文段,此时B希望收到的下一个报文段的数据是从第3个字节开始的,那么B发送给A的报文中的确认号字段应为3。发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。
TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节。例如,在图5.8中,接收方B收到了A发送的包含字节0~2及字节6~7的报文段。由于某种原因,B还未收到字节3~5的报文段,此时B仍在等待字节3(和其后面的字节),因此B到A的下一个报文段将确认号字段置为3。
🍓超时重传
TCP每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。
设定的计时器时间应略大于一个加权平均往返时间RTTs,但也不能大太多,否则当报文丢失不饿能及时重传
🍓冗余ACK重传
冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。
TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。
例如,发送方A发送了序号为1、2、3、4、5的TCP报文段,其中2号报文段在链路中丢失,它无法到达接收方,3、4、5号报文到达B,但它们不是B所期望收到的下一个报文,于是B就发送3个对1号报文段的冗余ACK,表示自己期望接收2号报文段。当A收到对于1号报文段的3个元余ACK,它可以认为2号报文段已经丢失。这时发送方A可以立即对2号报文执行重传,这种技术通常称为快速重传。当然,冗余ACK还被用在拥塞控制中,这将在后面的内容中讨论。
🍊4.5 TCP流量控制
🍓1.流量控制的功能
TCP提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务,匹配发送方的发送速率与接收方的读取速率
🍓2.如何实现流量控制
TCP提供一种基于滑动窗口协议的流量控制机制
🍓接收窗口rwnd
1.在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小。
2.即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。
🍓拥塞窗口cwnd
1.发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口
2.其大小与网络的带宽和时延密切相关。
·例如,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时B可以通过设置确认报文段首部的窗口字段来将rwnd通知给A。rwnd即接收方允许连续接收的最大能力,单位是字节。发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwnd大小之内,保证A不会使B的接收缓存溢出。当然,A的发送窗口的实际大小取rwnd和cwnd中的最小值.
·图5.10中的例子说明了如何利用滑动窗口机制进行流量控制。设主机A向主机B发送数据,在连接建立时,B告诉A:“我的接收窗口rwnd=400(字节)“接收方进行了三次流量控制,这三个报文段都设置了ACK=1,只有在ACK=1时,确认号字段才有意义。第一次把窗口减小到rwnd=300,第二次把窗口减小到rwnd=100,最后把窗口减小到rwnd=0,即不允许发送方再发送数据。这使得发送方暂停发送到状态将持续到B重新发出一个新的窗口值为止。
🍊4.6 TCP拥塞控制
·拥塞控制:防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时,端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加
·进行拥塞控制的4种算法:慢开始、拥塞避免、快重传和快恢复
·发送方在确定报文段的速率要考虑:
1.接收方的接收能力 2.从全局考虑不要使网络发生拥塞
·因此TCP协议要求维护以下两个端口:
1.接收窗口rwd:接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量。 ·由接收方根据其放在TCP报文的首部的窗口字段通知发送方 ·如下图中的接收方主机B通过发送rwnd=300来限制发送方的窗口大小
2.拥塞窗口cwd:发送方根据自己估算的网络拥塞程度而设置的窗口值。反映网络的当前容量。只要网络未出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络的分组数。发送窗口的上限值应取接收窗口rwnd和拥塞窗口cwnd中较小的一个,即
·发送窗口的上限值=minrwnd,cwnd
✨✨✨我是分割线✨✨✨
🔥5.如何维护拥塞窗口呢?
🍊5.1 慢开始和拥塞避免
🍓1 慢开始算法
使用慢开始算法后,先令拥塞窗口cwnd=1,每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍,即cwnd的大小指数式增长。这样,慢开始一直把拥塞窗口cwnd增大到一个规定的慢开始门限ssthresh(闽值),然后改用拥塞避免算法。
例如,A向B发送数据,发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,经过一个RTT后(也称一个传输轮次),A收到B对刚才两个报文的确认,于是把拥塞窗口调整为4,下一次发送时就可一次发送4个报文段。
🍓2 拥塞避免算法
拥塞避免算法的做法如下:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加1,而不是加倍,使cwnd按线性规律缓慢增长(即加法增大)
根据cwnd的大小执行不同的算法,可归纳如下:
·当cwnd<ssthresh时,使用慢开始算法
·当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法
·当cwnd=ssthresh时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)
🍓3 网络拥塞的处理
网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未按时收到确认,重传计时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方的cwnd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
为什么要这么操作呢? 这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。
拥塞避免并不能完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
1.初始时,拥塞窗口置为1,即cwnd=1,慢开始门限置为16,即ssthresh=16。
2.慢开始阶段,cwnd的初值为1,以后发送方每收到一个确认ACK,cwnd值加1,也即经过每个传输轮次(RTT),cwnd呈指数规律增长。当拥塞窗口cwnd增长到慢开始门限ssthresh时(即当cwnd=16时),就改用拥塞避免算法,cwnd按线性规律加性增长。
3.假定cwnd=24时网络发生拥塞,更新ssthresh的值为12(即变为超时时cwnd值24的一半),cwnd重置1,并执行慢开始算法,cwnd=12时,改为拥塞避免算法。
🍊2.快重传和快恢复
快重传和快恢复算法是对慢开始和拥塞避免算法的改进
🍓2.1快重传
快重传使用了冗余ACK来检测丢包的发生,当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时
🍓2.2快恢复
快恢复算法的原理如下:发送端收到连续三个冗余ACK(即重复确认)时,执行“乘法减小”算法,把慢开始门限ssthresh设置为出现拥塞时发送方cwnd的一半。与慢开始(慢开始算法将拥塞窗口cwnd设置为1)的不同之处是,它把cwnd的值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
注:在本节的最后,再次提醒读者:发送方发送窗口的实际大小由流量控制和拥塞控制共同决定。因此,当题目中同时出现接收端窗口(rwnd)和拥塞窗口(cwnd)时,发送方实际的发送窗口大小是由rwnd和cwnd中较小的那一个确定的
以上是关于计算机网络必看之·你确定了解传输层吗?的主要内容,如果未能解决你的问题,请参考以下文章