TCP(Transmission Control Protocol)是一种常用的传输层协议,用于在网络上可靠地传输数据。TCP使用三次握手进行连接的建立,以及四次挥手进行连接的终止。
三次握手是指在建立TCP连接时,客户端和服务器之间需要进行三次通信才能确保连接的可靠性。
以下是TCP三次握手的步骤:
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J(随机的序列号),并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K(随机的序列号),并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
四次挥手是指在终止TCP连接时,需要进行四次通信才能正确关闭连接。
以下是TCP四次挥手的步骤:
4.第一步(客户端发送关闭请求):当客户端确定不再向服务器发送数据时,客户端发送一个带有 FIN(结束)标志的数据包给服务器,表示客户端希望关闭连接。
5.第二步(服务器确认关闭请求):服务器收到客户端的关闭请求后,发送一个带有 ACK(确认)标志的数据包来确认收到关闭请求。但是服务器可能仍然有数据要发送给客户端。
6.第三步(服务器发送数据完成):服务器将其需要发送的数据发送完毕后,会发送一个带有 FIN(结束)标志的数据包给客户端,表示服务器的数据发送完成。
7.第四步(客户端确认关闭):客户端收到服务器的结束通知后,发送一个带有 ACK(确认)标志的数据包给服务器,表示客户端确认收到服务器的关闭请求。此时,客户端进入 TIME_WAIT(时间等待)状态,等待可能出现的延迟数据包,然后关闭连接。
这样,通过TCP的三次握手和四次挥手,可以确保可靠地建立和关闭连接,并保证数据的可靠传输。
同时挥手:
通过序列号与确认应答提高可靠性
- 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。
- 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
- 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
- 此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。
- 序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。