-
TCP连接建立需要在客户和服务器之间交换3个TCP报文段。
客户端和服务器端的报文段需要交互三次,称之为三报文握手。
-
如上图,
假定主机A运行的是TCP客户程序
,而B运行TCP服务器程序
。
起初两端的TCP进程都处于CLOSED(关闭)状态
。
B的TCP服务器进程先创建传输控制块TCB
,准备接受客户进程的连接请求。然后服务器进程
就处于LISTEN(收听)状态
,等待客户的连接请求;若有则作出响应。
A的TCP客户进程也是首先创建传输控制模块TCB
,① 然后在打算建立TCP连接时,向B发出连接请求报文段
;此报文段首部中的同步位SYN=1
(TCP规定SYN报文段
即SYN=1的报文段不能携带数据,但要消耗掉1个序号),同时选择一个初始序号seq=x
。此时TCP客户进程进入SYN-SENT(同步已发送)状态
。
② B收到连接请求报文段
后,若同意建立连接,则向A发送确认
。在确认报文段
中把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y
。这个报文段也不能携带数据,也同样要消耗掉一个序号。此时TCP服务器进程
进入SYN-RCVD(同步收到)状态
。
③TCP客户进程
收到B的确认后,还要向B给出确认。确认报文段
的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。(TCP规定ACK报文段可以携带数据,若需携带数据也不消耗序号,此情况下下一个数据报文段的序号仍是seq=x+1)。此时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态
,B收到A的确认后,也进入ESTABLISHED状态。
-
总结
1、A向B发送请求;
2、B向A发送确认,同时B向A发送请求;
3、A向B确认连接; -
A最后再发送一次确认的必要性
防止已失效的连接请求报文段
突然又传送到了B,产生错误。
如:
A发出的第一个连接请求报文
迟到了,于是A超时重传了第二个连接请求报文
;
若迟到的这个报文
在AB连接释放后才到达B;
若不需要A的最后一次确认,此时只要B向A发回对这个迟到的连接请求报文的确认,B就以为建立了连接;但是A并没有发出建立连接的请求,也不会向B发送数据,而B会一直等待A发来数据,B的许多资源被浪费
5.9.1 TCP的连接建立
最新推荐文章于 2022-01-26 17:34:02 发布