TCP三次握手机制

TCP是面向连接的协议。 TCP连接的建立采用客户端/服务器方式。主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器
TCP三次握手机制_第1张图片
(1)服务器的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,即作出响应。

(2)客户端的TCP客户进程也是首先创建传输控制模块TCB,然后向服务器发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。此时,TCP客户进程进入SYN_SENT(同步已发送)状态
TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但是要消耗掉一个序号,即下一个字节序号为seq=x+1

(3)服务器收到连接请求报文段后,如同意建立连接,则向客户端发送确认。在确认报文段中应把SYNACK都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。此时,TCP服务器进程进入SYN-RCVD(同步收到)状态
请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号, 即下一个字节序号为seq=y+1。

(4)TCP客户进程收到服务器的确认后,还要向服务器给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态
TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。

(5)当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

首部固定部分各字段的意义如下:
(1)序号(seq)
TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段则指的是本报文段所发送的数据的第一个字节的序号。
例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;

(2)确认号(ack)
期望收到对方下一个报文段的第一个数据字节的序号。
例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;

(3)同步SYN(SYNchronization)
在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

(4)确认ACK(ACKnowlegment)
仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1。

参考文献:
谢希仁编著 《计算机网络(第六版)》

你可能感兴趣的:(网络知识)