TCP连接的建立(TCP三次握手)
TCP连接的建立采用客户服务器方式。主动发起连接建立的应用京城叫做客户,被动等待连接建立的应用进程叫做服务器。
TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,所以叫“三次握手”,实际上是三报文握手,也就是一次握手交换了三个报文。
假设客户为A,服务器为B,A的TCP客户进程已经打开传输控制模块TCB,等待请求连接。B的TCP客户进程也已经打开TCB没等待客户的连接请求。
连接建立的过程如下:
- A向B发送请求报文段,不可携带数据。
- B向A发送确认报文段,不可携带数据。
- A收到B的确认后,A进入ESTABLISHED(连接已建立)状态。A向B发送确认报文段,可携带数据,B收到A的确认后,才进入ESTABLISHED。
之所以需要第三次握手,即A需要再向B确认一次,其原因如下:
假如不需要第三次握手,那么B在向A发送完确认报文段后,B就要进入ESTABLISHED状态,等待接收A的数据。那么假如出现下面这种情况。
A向B发送请求,超时后A再次发送请求,建立连接成功、传输完毕、释放连接。
但是之前A发送的第一次请求可能并未被丢弃,而是被拥塞在网络中,连接释放后的某个时刻到达了B,B收到此请求后向A发送确认报文段,并进入ESTABLISHED状态。
A由于没有发送过请求,当然不会理会B的确认报文,也不会向B发送数据。
这样B就会一直等待A发送数据,连接也不会被释放,白白浪费了B的资源。