你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客
这是我的 github https://github.com/Qiuner ⭐️
gitee https://gitee.com/Qiuner 🌹
如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^)
想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎
计算机网络学习记录 运输层 Day5
- 老师的动画、课件做的一如既往的好,很难找到写注释的地方。但在TCP三次握手四次挥手部分可能会有点懵,因此我做了详细的介绍,在讲这一章时,私以为应当先讲后面TCP报文段首部格式的,不然不知道FIN、seq、ack等,不知道为什么要这样安排课程
- 相信您看了我的解释后,一定能快速理解,掌握这一重难点
运输层概述
-
这里的端口是标志符
-
任务管理器----详细信息
运输层端口号 复用 分用概念
- 下面描述了一个信息从用户pc浏览器显示的过程,建议直接看视频,截图不好描述且视频说的很清楚
- 5.2 运输层端口号、复用与分用的概念_哔哩哔哩_bilibili
UDP与TCP
TCP的流量控制
流量控制 具体实现
- 这里还是建议看视频,视频讲的很好 5.4 TCP的流量控制_哔哩哔哩_bilibili
- 这个窗口之前已经出现过且说过了,您可以看这篇 计算机网络学习记录 数据链路层 Day3 (上)-CSDN博客
中的回退N帧协议,这个窗口的设计理念和他是差不多的
习题
答案
TCP拥塞控制
-
这一段建议直接看视频,动画做的非常好,这个老师着实有实力5.5 TCP的拥塞控制_哔哩哔哩_bilibili
-
要注意的是,你刚开始学到这里可能会想关于这个发送是不是持续发送这样偏门问题,但我个人认为可以理解为第一次发、第二次发、第三次发之类
- 到达ssthresh使用拥塞避免算法
- 重传器超时将ssthresh变为一半然后使用慢开始算法
慢开始、拥塞避免有什么用?为什么要使用?
- 首要用处,当然是使用这两个算法能够
- 网络不是一个永恒不变的东西,可能在某个时间段,网络能已 12 速度传输,而下个时间段,只能以 6 的速度传输了
- 这里重复确认 M2 是想让发送方发来丢失的 M2,其实没有说明在传输三个连续重复确认帧时,如果再出现丢失会发生什么
联系
答案
TCP超时重传时间的选择
当超时重传时间小时
- 注意 这里超时重传,不要和上面三个重传确认帧混起来。
- 可以这样理解:这个场景是基础的 发送方发送自己数据包后 就开始期待接受方给出确认收到
当超时重传时间大时
重传时间解决方案
- 很经典的解决方案,只要意识到一点:网络传输是一个持续不断的过程,那这种时候将每次传输都当做一个人,为了设计出最多人都能通过的门,只能取平均
TCP可靠传输的实现
发送窗口
- 这一段也是建议看视频 5.7 TCP可靠传输的实现_哔哩哔哩_bilibili
- 我感觉这老师稍微详细一点 那也不需要 别人做什么学习笔记了
习题
答案
TCP的运输连接管理 ** 连接建立三次握手
- 这个是比较重要的
- 客户端和服务端分别有个传输控制模块,这是在进行数据传输前必做的
名词解释
SYN:同步序列编号(Synchronize Sequence Numbers)
- SYN标志位用来标识连接请求。当一个主机希望与另一主机建立TCP连接时,它会发送一个设置了SYN标志位的数据包。
- 上图可以看见,两者都在一开始发送了SYN=1,这证明他们愿意和彼此建立TCP连接
seq:序列号(Sequence Number)
- seq字段包含发送方选择的初始序列号(Sequence Number)。这个序列号在连接建立时发送,并且后续的所有数据包都会基于这个序列号进行编号。
- 我的理解是:一开始发了一个100大小的数据包,然后基于这个100大小的数据包继续发送其他,这时候的seq等于100,在发送100数据包时,seq就等于200了(这里没有考虑到ack确认号)
ACK:确认序列编号(Acknowledge Sequence Numbers)
- ACK标志位表示确认。它用来确认接收到的数据包。每个TCP数据包都有一个ACK字段,它包含下一个期望接收的字节的序列号。
ack:确认号(Acknowledgment Number)
- ack字段包含期望接收到的下一个字节的序列号。换句话说,它是发送方收到的最后一个字节的序列号加1。
具体三次握手过程如下:
- 第一次握手:
- 客户端处于CLOSED(关闭)状态,向服务器发送一个SYN数据包,设置SYN=1,并选择一个初始序列号seq=x。
- 服务器接收到该数据包后,从CLOSED状态进入LISTEN(倾听)状态,并继续等待连接。
- 第二次握手:
- 服务器处于LISTEN状态,接收到客户端的SYN包后,回复一个SYN+ACK数据包,设置SYN=1,ACK=1,seq=y,并确认号ack=x+1。
- 客户端接收到该数据包后,从SYN-SENT状态进入ESTABLISHED(已建立连接)状态。
- 第三次握手:
- 客户端处于ESTABLISHED状态,接收到服务器的SYN+ACK包后,回复一个ACK数据包,设置ACK=1,seq=x+1,并确认号ack=y+1。
- 服务器接收到该数据包后,从SYN-RCVD状态进入ESTABLISHED状态。
此时,TCP连接建立完成,客户端和服务器可以开始数据传输。
- 第一个TCP请求因为晚到,发到服务器端后,服务端就直接建立连接了,但此时,TCP客户端已经关闭,因此,服务器白白等待
练习
- 多看看我的解释,就能理解了
答案
- 其中ACK是迷惑
TCP的运输连接管理 ** 连接释放
FIN:终止连接(Finish)
- FIN标志位表示发送方希望终止连接。当一方希望关闭连接时,会发送一个带有FIN标志的数据包。
- 其他和上面握手是一样的
- 通俗就是 客户端说我要走了 (一次挥手),然后服务端将自己最后要传输的数据传过去(二次挥手),然后说那我断开了(三次挥手),客户端收到后再发一条,确认断开(四次),这个时候客户端要等一会,因为怕这个确认断开传输丢失了
具体的四次挥手过程如下:
- 第一次挥手(FIN from client):
- 客户端处于ESTABLISHED状态,发送一个带有FIN标志的数据包给服务器,设置FIN=1,seq=u,ack=v。
- 服务器接收到该数据包后,进入CLOSE-WAIT状态。
- 第二次挥手(ACK from server):
- 服务器处于CLOSE-WAIT状态,确认收到客户端的FIN包,发送一个ACK数据包,设置ACK=1,seq=v,ack=u+1。
- 客户端接收到该数据包后,进入FIN-WAIT-1状态。
- 第三次挥手(FIN from server):
- 服务器处于CLOSE-WAIT状态,准备关闭连接,发送一个带有FIN标志的数据包,设置FIN=1,seq=w,ack=u+1。
- 客户端接收到该数据包后,进入FIN-WAIT-2状态。
- 第四次挥手(ACK from client):
- 客户端处于FIN-WAIT-2状态,确认收到服务器的FIN包,发送一个ACK数据包,设置ACK=1,seq=u+1,ack=w+1。
- 服务器接收到该数据包后,进入CLOSED状态。
- 客户端在发送完ACK后,进入TIME-WAIT状态,等待2MSL(Maximum Segment Lifetime,最大报文段生存时间),以确保服务器已经收到确认包,然后进入CLOSED状态。
- 通过这四次挥手,TCP连接的双方能够安全地关闭连接,确保所有在传输中的数据都能够被成功接收。
TCP报文段的首部格式
-
这里还是建议直接看视频 5.9 TCP报文段的首部格式_哔哩哔哩_bilibili
-
都是一些新概念,得要多看几遍