TCP建立连接
我们先来看一张图片简单了解一下TCP在请求中是为什么要进行三次“对话”
简单理解
具体过程
三次握手的具体过程如下:
- 第一次握手:
- 客户端:客户端向服务端发送一个SYN报文段,请求建立连接。这个报文段会包含客户端的初始序列号(ISN,Initial Sequence Number),用于标识后续发送的数据包的顺序。同时,SYN标志位被置为1,表示这是一个连接请求。
- 状态:客户端发送完SYN报文段后,进入SYN_SENT状态,等待服务端的回应。
- 第二次握手:
- 服务端:服务端收到客户端的SYN报文段后,会回复一个SYN-ACK报文段给客户端。这个报文段会包含服务端的初始序列号,以及一个确认号(ACK Number),该确认号是客户端SYN报文段的序列号加1,表示服务端已经收到了客户端的连接请求。同时,SYN标志位也被置为1,表示服务端也同意建立连接。
- 状态:服务端发送完SYN-ACK报文段后,进入SYN_RCVD状态,等待客户端的最终确认。
- 第三次握手:
- 客户端:客户端收到服务端的SYN-ACK报文段后,会向服务端发送一个ACK报文段作为最终的确认。这个报文段的确认号是服务端SYN-ACK报文段的序列号加1,表示客户端已经收到了服务端的连接确认。此时,SYN标志位不被置为1,因为这不是一个连接请求。
- 状态:客户端和服务端都收到对方的最终确认后,都进入ESTABLISHED状态,表示TCP连接已经成功建立,双方可以开始传输数据了。
三次请求原因
- 确认双方的发送和接收能力:通过三次握手,客户端和服务端都能确认自己和对方的发送能力和接收能力正常,从而确保双方可以正常通信。
- 同步双方的初始序列号:TCP连接中,每个传输的数据包都会有一个序列号,用于标识该数据包的顺序。三次握手过程中,双方会交换各自的初始序列号,以便后续的数据传输能够按照正确的顺序进行。
- 防止已失效的连接请求报文段重复触发连接:在网络中,可能存在一些已经失效的连接请求报文段。通过三次握手,可以确保只有有效的连接请求才能建立连接,从而避免已失效的报文段对新的连接请求造成干扰
TCP断开连接
简单的理解
具体过程
- 第一次挥手:
- 客户端:当客户端完成数据传输后,会发送一个FIN报文段给服务端,表示客户端希望关闭连接。此时,客户端进入FIN_WAIT_1状态。
- FIN报文段:这个报文段的FIN标志位被置为1,表示请求释放连接,同时会包含一个序列号seq,用于标识这个FIN报文段的唯一性。
- 第二次挥手:
- 服务端:服务端收到客户端发送的FIN报文段后,会发送一个ACK报文段给客户端,表示已经收到客户端的关闭连接请求。此时,服务端进入CLOSE_WAIT状态。
- ACK报文段:这个报文段的ACK标志位被置为1,确认序号为客户端FIN报文段的序列号加1(seq+1),表示服务端已经成功接收到了客户端的FIN报文段。
- 第三次挥手:
- 服务端:当服务端也完成数据传输后,会发送一个FIN报文段给客户端,表示服务端也希望关闭连接。此时,服务端进入LAST_ACK状态。
- FIN报文段:与服务端发送的第一个ACK报文段类似,这个FIN报文段也包含了一个序列号seq,用于标识这个FIN报文段的唯一性。
- 第四次挥手:
- 客户端:客户端收到服务端发送的FIN报文段后,会发送一个ACK报文段给服务端,表示已经收到服务端的关闭连接请求。此时,客户端等待一段时间(通常是2MSL,即两个最大报文段生存时间)后,进入CLOSED状态,完成连接的释放。
- ACK报文段:这个报文段的ACK标志位被置为1,确认序号为服务端FIN报文段的序列号加1(seq+1),表示客户端已经成功接收到了服务端的FIN报文段。
四次请求原因
一、确保双方正确关闭连接
防止连接未完全关闭:在TCP连接中,数据的传输是双向的。四次挥手确保了每一方都能发送FIN报文段来表示自己没有数据要发送了,并等待对方的确认。这样,即使有一方的FIN报文段在网络中丢失,另一方也能通过超时机制来重新发送FIN报文段,从而确保连接能够完全关闭。
避免资源泄露:通过四次挥手,TCP连接的双方都能释放与连接相关的资源,如缓冲区、连接状态等,从而避免资源泄露。
二、保证数据的完整性和可靠性
确保数据完全传输:在TCP连接中,数据的传输需要保证完整性。四次挥手过程中,每一方都会等待对方的确认报文段,以确保自己已经发送的数据都被对方正确接收。只有在双方都确认对方没有数据要发送时,连接才会被关闭。
处理延迟数据:网络中存在延迟的可能性,有些数据可能在连接关闭时还在传输中。通过四次挥手,每一方都会等待一段时间(如2MSL),以确保所有延迟的数据都被处理完毕,从而避免数据丢失。