计算机网络传输层补充总结
本文内容课件选自B站UP:湖科大教书匠 的计算机网络微课堂,对计算机传输层重点知识体系进行系统梳理记忆。
运输层端口号复用与分用的概念
应用层报文使用TCP封装称之为TCP复用,使用UDP封装称之为UDP复用,反之解封装称之为分用。
TCP和UDP的对比
TCP和UDP的使用频率仅次于网际层的IP协议 使用UDP,用户之间可以随时进行数据传输交换,在TCP中的“建立连接”是一种逻辑连接,而非物理连接。 UDP支持一对一(单播),一对多(多播),一对全(广播)的通讯。 而TCP仅支持一对一的通讯。 UDP对应用进程交付下来的报文,既不合并也不拆分,而是保留报文的边界,也就是说UDP是面向应用报文的。 TCP并不知道也不关心应用进程进行传输的这一连串字节流,在自己的发送缓存中提取一定量的字节组成TCP头部进行传输,TCP是面向字节流的。TCP不保证接收方应用进程所收到的数据块与发送方应用进程所发出的数据块具有对应大小的关系,例如发送方进程交给发送方的TCP10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付给了上层的应用进程,但接收方接收的字节流必须和发送方应用进程发出的字节流完全一样。
UDP由于提供不可靠的传输服务,它与IP协议相比仅仅提供了用于区分应用进程的端口的功能,故首部结构十分简单,每部分占2个字节。 TCP要提供可靠传输,流量控制,拥塞控制等功能,故首部内容十分复杂
TCP的流量控制
在收到接收方的累计确认ack之后,可将在发送方缓存中存在的ack=x之前的所有字节数据删除,因为它们已经全部正确到达接收方。 大写ACK是TCP报文段首部中的标志位,取值1表示这是一个TCP确认报文段。 小写ack是TCP报文段首部中的确认号字段,ack=x表示序号x之前的数据均已全部正确接收。 即时接收窗口为0,接收方也必须接收零窗口探测报文段、确认报文段、以及携带有紧急数据的报文段。 零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口报文段会被重传。
示例
TCP发送方的发送窗口 = min[自身拥塞窗口,TCP接收方的接收窗口]
TCP的拥塞控制
理想的拥塞控制状态下,横线表示输入的负载中有一部分损失掉了,例如,输入到网络中的某些分组被某个结点丢弃掉了。即使在这种状况下,网络的吞吐量仍然维持在其所能达到的最大值。实际的拥塞控制曲线应当尽量接近理想的拥塞控制曲线。
![在这里插入图片描述](https://img-blog.csdnimg.cn/64b28997fc1446bc8f3a1b74940c8664.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1a4a9fc0f50b4fff8f75321ccc19cc6d.png)
慢开始与拥塞避免
传输轮次是指,发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,其实就是往返时间,往返时间并非是恒定的数值,使用传输轮次是为了强调把拥塞窗口所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认。 由于swnd=cwnd即拥塞窗口值是几就能发送多少个报文段。
快重传与快恢复
慢开始和快重传的整合理解
示例
较为简单,不作说明
TCP超时重传时间的选择
当RTO过小(小于RTT0)时会引起不必要的重传,使网络负荷增大。
当RTO过大(大于RTT0)时,会使网络的空闲时间增大,降低了传输效率。
每个IP数据报选择的转发路由可能都不同,如果一直使用RTT0作为RTO的选择标准,可能导致在另一条路由线路上,RTO<RTT1。这对数据报1是很不合适的,会造成没必要的重传。 将第一次测量得到的RTT作为RTTs,随后进行不断测量更新。
无法正确测量出RTT的两种情况
解决方法:
示例
TCP可靠传输的实现
- 未收到确认的数据都必须在发送缓存中保留,以方便在超时重传过程中使用,在收到确认ack=x之后,可以将x之前的(不包含x,x表示期望接收的下一个数据序号)数据内容备份从缓存中删除。
- TC不建议发送窗口前沿向后收缩这种情况,因为在接收方发来通知缩小发送窗口之前,发送方可能已经将不在发送窗口大小内的数据发出,这显然将产生错误。
发送窗口的状态描述
接收方并不会丢弃32号与33号数据,仍将它们存放在接收缓存中,请求31号数据的发送,在成功接收31号数据之后,可将31,、32/33号数据交付与应用进程,滑动接收窗口。
TCP可靠传输中的规定
TCP连接的建立
TCP连接要解决的问题
连接建立的具体过程
- 然后TCP服务器进程被动等待来自TCP客户进程的连接 请求,被动打开连接。
- TCP客户端创建传输控制块。
-
- 向TCP服务器进程发送TCP连接请求报文段,并进入同步已发送状态。
TCP连接请求报文段首部中的同步位SYN被设置为1,表明这是一个TCP连接请求报文段,TCP规定SYN被设置为1的报文段不能携带数据但要消耗掉一个序号。 序号字段seq被设置了一个初始值x,作为TCP客户进程所选择的初始序号
。
- 由于TCP建立是由客户端主动发起的,因此称之为主动打开连接。
- 若同意连接,则向TCP客户端进程发送TCP连接请求确认报文段,并进入同步接收状态。
SYN与ACK均被设置为1,表示这是一个连接请求确认报文。序号字段seq被设置了一个初始值y作为TCP服务进程所选择的初始序号。确认字段ack的值被设置成了x+1,这是对TCP客户进程所选择的初始序号的确认,这个报文段也不能携带数据。
- 进入连接建立状态,TCP规定普通的TCP确认报文段可以携带数据,但如果不携带数据,则不消耗序号,在这种情况下,所发送的下一个数据报文段的序号仍是x+1。
ack = y+1表示对TCP所选择的初始序号的确认。
能否使用两次握手建立连接
第三次客户端发送针对TCP连接请求的确认的确认报文是否多余? ***答:***不多余。如图所示若客户端发送第一次TCP连接请求之后超时计时器超时,那么客户端就会再发送一个连接请求报文,在TCP服务器发来连接请求确认之后,由于改为两次握手,那么此时客户端和服务器之间TCP连接建立完毕,在数据传输完成后,使用四次挥手断开连接,在断开连接之后,第一次发送的TCP请求报文到达服务器端,服务器返回请求确认报文,但该请求确认报文到达客户端时,客户端处于关闭状态,不予处理该确认报文,但服务器端误以为已成功建立TCP连接,一直等待客户端传输数据,会因无效的TCP连接浪费主机的大量资源。 综上所述,不多余!这是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误。
示例
TCP的连接释放
TCP通过四次挥手来释放连接
- 客户端进入终止等待状态。
终止位FIN与确认位ACK位均置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认,序号字段seq的值设置为u,它等于TCP客户端进程之前已传送过的数据的最后一个字节的序号+1,TCP规定终止位FIN等于1的报文段即时不携带数据,也要消耗掉一个序号,确认字段ack的值设置为v,它等于客户进程已经收到的数据的最后一个字节的序号+1
- TCP服务器进入关闭等待状态。
seq的值与上一步ack的值相匹配(TCP服务器所发送的最后一个字节数据的序号+1),ack对上一步seq进行确认。这时表明客户端进程已经没有数据向服务器进程发送了,但从TCP服务器进程到TCP客户端进程这个方向的连接并未关闭,TCP服务器仍然可以向TCP客户端发送自
己要发送的数据,这个状态可能会持续一段时间。
- TCP服务器进入最后确认状态。
seq=w表明在关闭等待期间,服务器又发送了部分数据,ack=u+1这是对之前收到的TCP连接释放报文段的重复确认。
TCP客户端进入时间等待状态。 对于TCP服务器发送的连接释放报文,TCP客户端发送一个普通的TCP确认报文。 seq=u+1表明最开始的连接释放请求报文虽然不携带数据,但需要消耗一个序号。 ack=w+1表示对TCP服务器发来的连接释放报文的确认。 TCP服务器在接收到连接关闭确认报文后直接进入关闭状态,而TCP客户端进程需要等待2MSL才能进入关闭状态。
为什么在最后一次挥手之后客户端不能直接进入关闭状态
答:在最后一次连接释放确认报文丢失重传的情况下,以确保TCP客户端能顺利接收服务器发来的最后一次连接释放请求报文。同时,在TCP客户端进程在发送玩完最后一个YTCP确认报文段后,再经过2MSL时长,就可以使本次连接持续时间内所产生的所有报文段都行从网络中小时消失,使在下一次新的连接中,不会出现旧连接中的报文段。
保活计时器
TCP报文段的首部格式
源端口号和目的端口号
序号以及确认号
数据载荷部分的序号仅为字节数据标识,而非数据内容。
数据偏移
与IP数据报首部的首部长度字段是一致的,单位为4B。
窗口
发送窗口的大小还取决于拥塞窗口的大小,应从拥塞窗口和接收窗口中取小者。
校验和
检查范围是首部与数据载荷部分全部检查,IP数据报首部的检验和字段只检验首部,要区分开来。
SYN
FIN
复位标志位RST
推送标志位PUSH
紧急标志位URG
选项字段
### 填充字段 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc8884a0473443a895517680a53abe8f.png)
|