ReZero's Utopia.

TCP

Word count: 888Reading time: 3 min
2020/08/09 Share

TCP/IP

网络连接

注意网络状态的变化

1
2
syn_sent ->   established   -> fin_wait1 ->  fin_wait2 -> time_wait > closed
listen -> syn_rcvd -> established -> closed_wait -> last_ack =======> closed

三次握手

  1. SYN 失败

RTO变化:2**(cat /proc/sys/net/ipv4/tcp_syn_retries[即重传次数上限])

  1. SYN-ACK 失败

cat /proc/sys/net/ipv4/tcp_synack_retries

  1. ACK 失败:此时 服务端 syn-ack 重传已经到达最大次数,而客户端仍保持 established 状态

如果客户端不发数据,则依靠 保活机制 进行排除死链接

1
2
3
net.ipv4.tcp_keepalive_time=7200 保活时间:即两小时内无活动则启用保活机制
net.ipv4.tcp_keepalive_intvl=75 保活探测的时间间隔
net.ipv4.tcp_keepalive_probes=9 保活探测的次数

如果客户端发数据,重试多次后失败则断开由下面参数指定

cat /proc/sys/net/ipv4/tcp_retries2

FAST OPEN
  • 在第一次建立连接的时候,服务端在第二次握手产生一个 Cookie (已加密)并通过 SYN、ACK 包一起发给客户端,于是客户端就会缓存这个 Cookie,所以第一次发起 HTTP Get 请求的时候,还是需要 2 个 RTT 的时延;

  • 在下次请求的时候,客户端在 SYN 包带上 Cookie 发给服务端,就提前可以跳过三次握手的过程,因为 Cookie 中维护了一些信息,服务端可以从 Cookie 获取 TCP 相关的信息,这时发起的 HTTP GET请求就只需要 1 个 RTT 的时延;

net.ipv4.tcp_fastopn # 0 关闭 1 作为客户端 2 作为服务端 3 作为客服

重复确认和快速重传

当接收方收到乱序数据包时,会发送重复的 ACK,以使告知发送方要重发该数据包,当发送方收到 3 个重复 ACK 时,就会触发快速重传,立该重发丢失数据包。

https://mp.weixin.qq.com/s/jTDU-zxP1INTYLpGLypjXQ

滑动窗口

https://mp.weixin.qq.com/s/HjOUsKn8eLfDogbBX3hPnA

流量控制
拥塞控制

四次挥手

TCP copy

HTTPS

https://cloud.tencent.com/developer/article/1683580?fromSource=gwzcw.1293314.1293314.1293314&cps_key=ad1dd5b36e1c498308f7302ab4cdabb7

SSL/TLS 的握手过程

  1. 在进行通信前,首先会进行 HTTP 的三次握手,握手完成后,再进行 TLS 的握手过程

  2. ClientHello:客户端通过向服务器发送 hello 消息来发起握手过程。这个消息中会夹带着客户端支持的 TLS 版本号(TLS1.0 、TLS1.2、TLS1.3) 、客户端支持的密码套件、以及一串 客户端随机数。

  3. ServerHello:在客户端发送 hello 消息后,服务器会发送一条消息,这条消息包含了服务器的 SSL 证书、服务器选择的密码套件和服务器生成的随机数。

  4. 认证(Authentication):客户端的证书颁发机构会认证 SSL 证书,然后发送 Certificate 报文,报文中包含公开密钥证书。最后服务器发送 ServerHelloDone 作为 hello请求的响应。第一部分握手阶段结束。

  5. 加密阶段:在第一个阶段握手完成后,客户端会发送 ClientKeyExchange 作为响应,这个响应中包含了一种称为 The premaster secret
    的密钥字符串,这个字符串就是使用上面公开密钥证书进行加密的字符串。随后客户端会发送 ChangeCipherSpec,告诉服务端使用私钥解密这个 premaster secret 的字符串,然后客户端发送 Finished 告诉服务端自己发送完成了

  6. 实现了安全的非对称加密:然后,服务器再发送 ChangeCipherSpec 和 Finished 告诉客户端解密完成,至此实现了 RSA 的非对称加密。

CATALOG
  1. 1. TCP/IP
    1. 1.1. 网络连接
      1. 1.1.1. 三次握手
        1. 1.1.1.1. FAST OPEN
        2. 1.1.1.2. 重复确认和快速重传
        3. 1.1.1.3. 滑动窗口
        4. 1.1.1.4. 流量控制
        5. 1.1.1.5. 拥塞控制
      2. 1.1.2. 四次挥手
    2. 1.2. TCP copy
    3. 1.3. HTTPS
      1. 1.3.1. SSL/TLS 的握手过程