TCP

ReZero lol

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 的非对称加密。

  • Post title:TCP
  • Post author:ReZero
  • Create time:2020-08-09 18:48:00
  • Post link:https://rezeros.github.io/2020/08/09/tcp/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments