A:主机A的TCP客户进程,B:主机B的TCP服务器进程
最初A、B为CLOSED(关闭)状态,A主动打开连接,B被动打开连接进入LISTEN(收听)状态(被动打开连接不明白,是指从被打开后就一直处于打开后的LISTEN状态吗 )
连接前A,B分别都要创建传输控制块TCB
1.A向B发连接请求报文段,SYN=1,seq=a(这里设序号为a),不携带数据,消耗序号据,本人理解SYN=1,ACK=0报文也叫SYN报文。A进入SYN-SENT(同步已发送)状态。
2.B向A发确认报文段,ACK=1,SYN=1,seq=b(同-设),ack=a+1,不携带数据,消耗序号。B进入SYN-RCVD(同步已建立)状态
3.A对B的确认报文进行确认,ACK=1,seq=a+1,ack=b+1。A进入ESTABLISHED(已建立连接)
可携带数据,也可不带数据,不带则不消耗序号,据理解SYN=0,ACK=1称ACK报文。
不消耗序号指,如A在3中不携带数据,则A发的下一个报文序号仍为a+1.
B收到确认后同进入ESTABLISHED状态
建立连接四握手,效果同,相对于三,把步骤2分步为ACK报文、SYN报文
三次握手的第三次握手必要性:
如只两次握手,现存情况如下
A向B发连接请求,但这一报文,在网络长时间停滞(某种原因)至超时,A重传后,顺利与B连接,传输,关闭连接。但就在这之后A第一次发的请求报文,那个停滞的,终于到达B(说明这个报文寿命不短)。B对报文发出确认,连接即建立,而A,B中只有B认为建立了连接,预留资源,等待A发送数据。浪费了资源。
使用三握,那么B就会在没收到A的确认后知道A并未请求。避免上面情况。
有问题,望指出。