TCP的连接建立又称为三次握手,谢希仁版教材中成为三报文握手,即客户端进程与服务器端进程通过三次报文的传输建立了TCP连接。
首先TCP首部为:
连接流程:
注意:
序号:自己发送的报文段的数据的第一个位置序号。
确认号:期望收到对方下一个报文段的第一个数据字节的序号。
确认ACK:仅当ACK=1的时候确认号字段才有效,规定建立连接后所有的报文段的ACK=1。
同步SYN: 在建立连接时用来同步信号,若SYN=1,ACK=0,表示这是一个连接请求报文段;若SYN=1,ACK=1,表示这是一个同意连接报文段。
1
首先,客户端A进程与服务器端B进程都处于关闭(CLOSED)状态。然后A主动打开连接,B被动打开连接。
2
一开始,B进程创建传输控制块TCB,并进入LISTEN收听状态,等待客户端的连接请求。
3
与此同时,客户端A进程也创建进程控制块TCB。当想和B建立TCP连接时,向B发送连接请求报文段,此报文段首部中的同步位SYN=1,并且设置一个初始序号seq=x,并且此报文段不携带数据,并且消耗一个序号,即这个序号代表连接请求,并不代表数据的位置。此时客户端A进程进入同步已发送状态(SYN-SENT),即此时A还不能确定此时自己发送能力是否完善,一点也不确定自己收听能力是否完善。
4
B收到A的连接请求报文段时,如果同意连接,则向A发送一个同意连接报文段,此报文段中SYN和ACK位置1,并且确认号ack=x+1,并且初始化自己的初始序号为y。并且此报文段不携带数据,并且消耗一个序号,即这个序号代表同意连接,并不代表数据的位置。此时服务器端B进程进入同步收到(SYN-RECV)状态。即此时A不能确定此时自己和B的发送能力是否完善,也不确定自己和B收听能力是否完善,但是B知道A的发送能力和自己的接受能力没问题,但是不能确定A的接收能力和自己的发送能力怎么样。
5
当客户端A进程收到B的同意连接报文段后,此时A已经知道自己的发送和接受能力都没问题了,也知道B的发送和接收能力也都没问题了,但是B还不知道这个情况,所以还要向B发送一个确认报文段。此报文段中ACK置1,确认号ack=y+1,同时自己的序号seq=x+1(确认报文段可以带数据,也可以不带数据,如果不带数据,则下次发送的数据报文段的序号也为x+1)。发送后便将自己变成ESTABLISHED(建立连接)状态。
6
当B收到A的确认报文段后,知道双方的发送和接收能力都没问题了,所以可以愉快的发送消息了,便将自己也置为ESTABLISHED(建立连接)状态。