TCP
TCP/IP
网络连接
注意网络状态的变化
1 | syn_sent -> established -> fin_wait1 -> fin_wait2 -> time_wait > closed |
三次握手
- SYN 失败
RTO变化:2**(cat /proc/sys/net/ipv4/tcp_syn_retries[即重传次数上限])
- SYN-ACK 失败
cat /proc/sys/net/ipv4/tcp_synack_retries
- ACK 失败:此时 服务端 syn-ack 重传已经到达最大次数,而客户端仍保持 established 状态
如果客户端不发数据,则依靠 保活机制 进行排除死链接
1 | net.ipv4.tcp_keepalive_time=7200 保活时间:即两小时内无活动则启用保活机制 |
如果客户端发数据,重试多次后失败则断开由下面参数指定
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
SSL/TLS 的握手过程
在进行通信前,首先会进行 HTTP 的三次握手,握手完成后,再进行 TLS 的握手过程
ClientHello:客户端通过向服务器发送 hello 消息来发起握手过程。这个消息中会夹带着客户端支持的 TLS 版本号(TLS1.0 、TLS1.2、TLS1.3) 、客户端支持的密码套件、以及一串 客户端随机数。
ServerHello:在客户端发送 hello 消息后,服务器会发送一条消息,这条消息包含了服务器的 SSL 证书、服务器选择的密码套件和服务器生成的随机数。
认证(Authentication):客户端的证书颁发机构会认证 SSL 证书,然后发送 Certificate 报文,报文中包含公开密钥证书。最后服务器发送 ServerHelloDone 作为 hello请求的响应。第一部分握手阶段结束。
加密阶段:在第一个阶段握手完成后,客户端会发送 ClientKeyExchange 作为响应,这个响应中包含了一种称为 The premaster secret
的密钥字符串,这个字符串就是使用上面公开密钥证书进行加密的字符串。随后客户端会发送 ChangeCipherSpec,告诉服务端使用私钥解密这个 premaster secret 的字符串,然后客户端发送 Finished 告诉服务端自己发送完成了实现了安全的非对称加密:然后,服务器再发送 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.