1.2. tcp-ip 协议
三次握手 Three-Way Handshake
建立TCP连接时所采用的一种过程,它确保客户端和服务器之间的通信通道是可靠的
目的
- 同步双方的序列号:确保双方都知道彼此的数据传输从哪里开始。
- 确认彼此的存在:确认对方能够接收到发送的信息,并准备好发送和接收数据。
- 初始化连接参数:设置通信的基本参数,如初始序列号和窗口大小。
第一次握手 SYN
客户端向服务器发送一个SYN(同步序列编号)包,包含一个初始序列号 Seq = X
第二次握手 SYN - ACK
服务器收到SYN包后,回复一个SYN-ACK(同步-确认)包。这个包包含服务器的初始序列号Seq = Y,并确认收到了客户端的序列号Ack = X + 1
第三次握手:ACK
客户端收到SYN-ACK包后,向服务器发送一个ACK(确认)包。这个包确认了服务器的序列号Ack = Y + 1,并使用自己的序列号Seq = X + 1
为什么需要三次握手
- 防止重复连接:三次握手确保了双方都知道彼此的存在,并且没有误解或重复的连接请求。
- 同步序列号:通过交换SYN和ACK包,双方能够同步初始序列号,从而正确地管理数据包的顺序。
- 测试双方的可达性:确保双方的网络路径是通畅的,数据包能够正确地传递和接收。
wireshark 抓取三次握手的包
第一次握手的时候,ack == 0, syn == 1 因此filter 的使用代码tcp.flags.ack == 0 and tcp.flags.syn == 1
第二次握手的时候 tcp.flags.syn == 1 and tcp.flags.ack == 1
第三次握手的时候 tcp.flags.ack == 1 and tcp.flags.syn == 0
四次挥手 Four-Way Handshake
当一方想要终止连接时所采用的关闭过程。确保了在连接关闭时,双方都能有序地终止通信,并且没有任何数据丢失。
步骤
- 第一次挥手(FIN):客户端发送连接释放报文
- 第二次挥手(ACK):服务器确认接收连接释放报文
- 第三次挥手(FIN):服务器发送连接释放报文
- 第四次挥手(ACK):客户端确认接收连接释放报文
超时和重传
在实际网络中,由于可能存在网络延迟或丢包的情况,TCP四次挥手中的每一步都可能会涉及超时和重传机制:
- 超时:如果一方在合理时间内没有收到对方的确认,它会重新发送FIN或ACK包。
- 重传:为了保证连接的可靠关闭,TCP协议会在超时后重传未被确认的包,直到收到对方的确认或超时次数达到上限。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
