• 图解网络(三)——TCP篇06


    3 TCP篇

    3.15 HTTPS中的TLS和TCP能同时握手么

    image-20220824112209089

    三次握手,再进行 TLS 四次握手

    一般情况下,不管 TLS 握手次数如何,都得先经过 TCP 三次握手后才能进行,因为 HTTPS 都是基于 TCP 传输协议实现的,得先建立完可靠的 TCP 连接才能做 TLS 握手的事情。

    那面试官说的这句「HTTPS 中的 TLS 握手过程可以同时进行三次握手」对不对呢?

    这个场景是可能发生的,但是需要在特定的条件下才可能发生,如果没有说任何前提条件,说这句话就是在耍流氓。

    那到底什么条件下,这个场景才能发生呢?需要下面这两个条件同时满足才可以:

    • 客户端和服务端都开启了 TCP Fast Open 功能,且 TLS 版本是 1.3;
    • 客户端和服务端已经完成过一次通信。

    客户端和服务端同时支持 TCP Fast Open 功能的情况下,在第二次以后到通信过程中,客户端可以绕过三次握手直接发送数据,而且服务端也不需要等收到第三次握手后才发送数据。

    如果 HTTPS 的 TLS 版本是 1.3,那么 TLS 过程只需要 1-RTT

    因此如果「TCP Fast Open + TLSv1.3」情况下,在第二次以后的通信过程中,TLS 和 TCP 的握手过程是可以同时进行的。

    如果基于 TCP Fast Open 场景下的 TLSv1.3 0-RTT 会话恢复过程,不仅 TLS 和 TCP 的握手过程是可以同时进行的,而且 HTTP 请求也可以在这期间内一同完成。

    3.16 TCP keepalive和HTTP keepalive是一个东西么

    TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?

    这是个好问题,应该有不少人都会搞混,因为这两个东西看上去太像了,很容易误以为是同一个东西。

    事实上,这两个完全是两样不同东西,实现的层面也不同:

    • HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接;
    • TCP 的 Keepalive,是由 TCP 层(内核态) 实现的,称为 TCP 保活机制;

    这样实在太累人了,一次连接只能请求一次资源。

    能不能在第一个 HTTP 请求完后,先不断开 TCP 连接,让后续的 HTTP 请求继续使用此连接?

    当然可以,HTTP 的 Keep-Alive 就是实现了这个功能,可以使用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,避免了连接建立和释放的开销,这个方法称为 HTTP 长连接

    TCP 的 Keepalive 这东西其实就是 TCP 的保活机制,它的工作原理我之前的文章写过,这里就直接贴下以前的内容。

    如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。

    • 如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
    • 如果对端主机崩溃,或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡

    所以,TCP 保活机制可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活,这个工作是在内核完成的。

    HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。

    TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。

    3.17 TCP协议有什么缺陷

    TCP 通过序列号、确认应答、超时重传、流量控制、拥塞控制等方式实现了可靠传输,看起来它很完美,事实真的是这样吗?TCP 就没什么缺陷吗?

    所以,今天就跟大家聊聊,TCP 协议有哪些缺陷?主要有四个方面:

    • 升级 TCP 的工作很困难;
    • TCP 建立连接的延迟;
    • TCP 存在队头阻塞问题;
    • 网络迁移需要重新建立 TCP 连接;

    3.18 如何基于UDP协议实现可靠传输

    img

  • 相关阅读:
    【控制】基于Matlab实现含最速跟踪微分器的自抗扰控制技术
    docker 命令
    Neo4j入门实战
    Notes原生应用Nomad上的表单设计
    VS Code搭配code runnner编译时提示:g++: fatal error: no input files解决方法
    redis
    在线副业教程之 01 如何通过编码赚钱的 6 种方法
    学习C++第二十四课--成员函数模板,模板显示实例化与声明笔记
    C++文件操作
    八股文随笔1
  • 原文地址:https://blog.csdn.net/qq_41945053/article/details/126501840