TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫作客户(Client);被动等待连接建立的应用进程被称为服务器(Server)。
TCP建立连接的过程叫作握手。握手需要在客户和服务器之间交换三个TCP报文段,所以TCP连接的建立通常也被称为三报文握手。采用三报文握手是要保证通信双方互相确认对方的真实存在和对本次通信的“诚意”,也是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。
下面来介绍一下连接建立阶段的三次握手过程。
第一次握手:客户端的应用进程主动打开,并向服务端发出SYN连接请求报文段。发起连接请求的报文段首部中SYN位必须要设置为1。另外,发起连接请求的一方还要随机生成本方的字节流起始编号x,并把这个编号放在数据段首部的“序号”字段中发送给对方,即SYN=1,seq=x。
第二次握手:服务器应用进程被动打开。在接收到客户端的连接请求报文段后,服务器方若同意请求,则发回确认报文SYN+ACK。在应答报文段的首部中,SYN位必须为1;确认号须设置为有效,以确认刚刚收到的数据段;服务端也要生成本次通信的字节流起始编号y,并把它放在回应数据段的首部,即SYN=1;ACK=1,ack=x+1;seq=y。
第三次握手:客户端在收到确认报文之后,一方面要通知上层应用进程连接已建立;另一方面还要对服务器第二次握手的SYN报文进行确认。这个对服务器SYN的确认报文,就是要通过确认号表达对第二次握手报文的确认,其首部中确认号必须有效,对编号为y的数据进行确认,即ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。
在这个过程中,通信双方的状态如图5-20所示。TCP连接时的各种状态表示如下:
CLOSED:没有任何连接状态。
LISTEN:侦听来自远方的TCP端口的连接请求,表示可以接受连接了。
SYN-SENT:客户端在发送连接请求后,等待与之匹配的连接请求应答。(www.xing528.com)
SYN-RECEIVED:服务端在收到和发送一个连接请求后,等待对方对连接请求的确认。这个状态表示接收到了SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,在这种状态下,当收到客户端的ACK报文后,它会进入ESTABLISHED状态。
ESTABLISHED:代表一个成功建立起来的连接。
当三次握手完成后,TCP客户端和服务器端成功地建立连接,可以开始传输数据了,只要通信双方没有一方发出连接释放的请求,连接就将一直保持。
为什么TCP连接采用的是三次握手协议?采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因此产生错误。下面的例子将介绍这种情况。
图5-20 TCP连接建立的“三次握手”过程示意
当客户端发送一次请求A后,但是A在网络延迟了很久,造成超时,接着客户端重新又发送了一次请求A,暂且将其称为A1,但是此时在发送端,原来的连接A已经无效了。
连接请求报文段A1顺利到达请求连接的服务器,服务器响应了A1,并返回TCP连接确认,如果采用两次握手进行连接,此时,建立连接就已经完成,但是,当网络延迟了的连接请求报文A,历经千山万水终于到服务器了,服务器监听到有请求来了,则接受。由于报文A是一个正常连接请求报文,它携带着的TCP格式都是正确的,只是在网络中滞留的时间比较长,服务器无法鉴别这是一个延迟的报文,所以服务器确认此连接,并打开连接等待数据传输。此时,此连接在客户端已经无效废弃了,所以不会有数据传输,也不会通知服务“这是个被废弃的连接”,然而服务器一直连接会浪费资源,严重时,可导致服务器连接资源耗尽。解决这种问题也很简单,再补充一次连接就可以了。所以,TCP连接是采用三次握手协议进行连接的。
在连接建立的过程中,双方一般还会通过首部的“选项”字段来传递最大报文段长度(MSS),通知对方发给自己的TCP数据段的最大数据部分长度。MSS可以让主机限制另一端发送数据报的长度,这将使以较小MTU接收到一个网络上的主机避免在网络层分片。当建立一个TCP连接时,每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SYN报文段中,即第一、第二次握手)。如果一方没有接收到来自另一方的MSS值,则MSS就定为默认值——536 Byte。这个默认值允许20 Byte的IP首部和20 Byte的TCP首部,以适合576 Byte的IP数据报。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。