TCP三次握手
2022-03-17 / 4 min read
TCP的三次握手建立好了连接开始数据的传输,那么我们要知道是怎么建立连接的。
建立连接的过程
最开始的时候,客户端和服务器都是处于CLOSED状态,然后主动连接的是客户端,被动打开的是服务器。
- TCP服务器进程先创建TCB传输控制块,时刻准备接受连接客户端的请求,这个时候服务器进入监听状态。
- TCP客户进程也是需要先创建TCB传输控制块,然后想服务器发出连接请求报文,报文的里面的同部位SYN=1,同时选择初始序列号seq=x,此时,TCP客户端进入SYN-SENT(同步发送状态)。
TCP规定SYN不能携带数据,但是需要消耗掉一个序号 - TCP服务器收到请求报文后,如果同意连接,则发出确认报文。
确认报文中应该ACK=1,SYN=1,确认号是ack = x+1,同时会给自己初始化一个序列号seq=y,此时TCP服务器进程进入SYN-RCVD(同步收到)状态,这个报文不能携带数据,同样要消耗一个序号。 - TCP客户进程收到确认后,还要向服务器给出确认。确认的报文ACK=1,ack=y+1,自己的序列号seq = x+1,此时,TCP连接建立,然后客户端进入ESTABLISHEN(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则部消耗序号。
简单的流程
在TCP中,我们三次握手的首先就是客户端发送一个SYN包,然后服务端接收到这个SYN包后,进行初始化建立缓存区,然后发送一个SYN+ACK包进行确认,最后客户端接收到后,发送ACK包进行最后的确认。
在这里需要注意的事情,在第一次和第二次握手的时候我们是不能进行数据的传输的,也就是不能带其他的数据进行传输,然后第三次可以,前两次没有带数据包,然后都要占用一个序号位,第三握手的时候如果带了数据包就会占用序号位,但是如果没有那么久不会占用序号位。
为什么是三次握手
简单的说就是解决传输不可靠的手段,比如说客户端发出请求,得到了SYN+ACK包后就建立的连接,但是因为某种原因,客户端没有建立起第一个连接,然后重发了SYN包,这个时候服务器又发送了一个SYN+ACK包,这个时候就出现了问题,对于客户端来说这个时候建立了一个连接,但是对于服务器来说就建立了两个,这个时候就产生了错误,导致了数据传输的不可靠并且占用了过多的资源。综上所诉需要三次握手来避免这个问题的产生。
TCP传输过程中保证数据传输的可靠性
因为TCP是全双工的信道,所以下面的结论对于客户端和服务端都是可行的。
在TCP传输中,我们需要处理丢包和乱序问题。
在TCP的传输中,会创建一个发送缓冲区,然后把数据截取一部分,然后加上序列号、长度、数据内容,然后进行传输,当接收方接收到数据后,会回复一个报文,这个报文里面包含ACK确认信息,ACK = 序列号+长度 = 下一个起始序列号。这要一来一会的问答方式保证了数据传输的可靠性。
当丢失了报文,接收端可以要求发送端进行重新发送。