《趣谈网络协议》10-12章 day02

tcp和udp协议的区别,两者设计的初衷是基于两个不同的假设。

  • udp假设网络的状况一定是“好的”,超时和丢包都不会发生,所以我只需要将包发送给具体的端口即可,我相信包一定会顺利到达目的地。

  • tcp假设网络状况一定是“坏的”,传输过程中一定会出现问题,超时和丢包一定会发生,所以我需要自己维护一套机制来保证传输的可靠。

设计的初衷不同就体现在了协议本身上:

  • udp因为它的乐观,不考虑网络状况,所以只需要记录端口即可,端口关联的是一个唯一的进程,即只指定了通信两端的端口,消息的长度和一个验证消息是否损坏的校验和


    image.png
  • tcp不相信网络,必须得通过自身来保证消息的可靠,协议也就显得比较复杂。
  1. 源端口和目的端口:用于表示具体的应用
  2. 序号:用于确保发送的顺序
  3. 确认序号:用于告知当前接收的位置
  4. 标识位:用于标识包了类型,注意:一个包可以有多个标识位,比如syn和ack均为1,说明这包既是响应也是应答
  5. 窗口大小:用于确定发送速率,保持与当前网络状况齐平,减少超时和丢包发生
  6. 校验和:包完整性校验
  7. 紧急指针:
  8. 选项:这里就是对于tcp原有功能字段不足时,用于扩充的地方


    image.png

tcp三次握手

  1. 为什么不是两次握手,即一次应答(sync+ack)不行吗?
    不行,因为tcp连接的双方都不信任彼此,所以一次应答只能确认一方是否可靠。
    A: 你好B,在吗?
    B: 我在
    B: 你好A,你也在吗?
    A:我也在的
  2. 所以需要两次应答,即四次握手,但为什么实际不是四次呢?
    因为tcp包可以合并,tcp的标识位可以同时为sync和ack两种类型,所以可以将2,3两个包合并来提高效率
    A: 你好B,在吗?
    B: 我在,你好A,你也在吗?
    A:我也在的


    image.png

四次挥手

  1. 挥手流程:
    A:B 啊,我不想玩了。
    B:哦,你不想玩了啊,我知道了。
    B:A 啊,我也不玩了,拜拜。
    A:好的,拜拜。

  2. 流程上和握手类似,为什么2,3不能合并呢?
    因为B接收到A断开连接的请求时,可能还有没有发完的数据,无法立即断开连接,B只能等把数据发完了才能发送断开连接的请求,所以无法合并。


    image.png

其中还有很多细节,可以参考这张经典的tcp时序图:


image.png

你可能感兴趣的:(《趣谈网络协议》10-12章 day02)