网络层tcp丢包排查
其中在TCP连接中我们最需要关注的几个地方就是 序列号、确认号还有标记位(SYN、FIN、ACK、RST…)
序列号相当于是随机出来的一个ID,为本次TCP连接建立建议一个标志,序列号可以用来解决网络包乱序的问题
确认号主要用来表示「接收端」告诉「发送端」对上一个数据包已经成功接收(确认号可以⽤来解决网络包丢失的问题)
标记位主要就是用来表达各种意义,如 SYN = 1 时,表示希望创建连接。ACK = 1时,确认号字段有效。FIN = 1时,表示希望断开连接。RST = 1 时,表示TCP连接出现异常,需要断开。
————————————————
Tcp三次握手
syn
syn+ack
ack
———
面经之为什么不能采用两次握手,一定要三次???
这里我就用最简单的方式来告诉大家吧
第一次握手:客户端向服务端发送了网络包,服务端接收到了。可以证明⬇️
服务端知道了客户端的发送能力和服务端的接受能力是没有问题了
第二次握手:服务端的发包,客户端接收到了,此时可以证明⬇️
服务端知道了客户端的发送能力和服务端的接受能力是没有问题了
客户端知道 服务端的接受能力和发送能力没问题,自己的接受能力和发送能力没问题
但是此时的服务端不知道的是,自己发送的包客户端能不能接收到,也就是服务端无法确认自己的发送能力和客户端的接受能力是否正常 所以这个时候就需要 TCP 的第三次握手
第三次握手:客户端向服务端发包,服务端接收到了
此时的 服务端 就知道双方的发包能力和接受包的能力都是没问题的,也就建立起了TCP连接
————————————————
面经之三次握手的过程中可以发送数据吗
答案是可以的 第三次握手的时候,由于客户端已经知道双方的发包已经收包能力都是正常的,就可以正常的发送数据了
————————
面经之为什么要有 TIME_WAIT 这个状态
确保服务端已经接收到了由客户端发送过去的 ACK 报文,如果没有收到ACK报文的话,服务端会再起发送一个 FIN 报文给客户端,因为 TIME_WAIT 的时间至少是一个报文的来回时间,一般会使用及时,时间到了客户端就进入 CLOSE 状态
确保网络中已经没有 数据残缺 了,避免这次 TCP 连接中的数据污染到下一次 TCP 连接
————————————————
四次挥手
为什么中间两个fin和ack不能合到一起
因为要等待数据传输完才发送ack
面经之为什么要有 TIME_WAIT 这个状态
确保服务端已经接收到了由客户端发送过去的 ACK 报文,如果没有收到ACK报文的话,服务端会再起发送一个 FIN 报文给客户端,因为 TIME_WAIT 的时间至少是一个报文的来回时间,一般会使用及时,时间到了客户端就进入 CLOSE 状态
确保网络中已经没有 数据残缺 了,避免这次 TCP 连接中的数据污染到下一次 TCP 连接
————————————————