TCP报文段
如何建立一条TCP连接
客户中的TCP会用以下的方式与服务器中的TCP建立一条TCP连接:
第一步:客户端的TCP首先向服务端的TCP发送一条特殊的TCP报文段。该报文段中不能包含应用层数据。但是在报文段的首部中的一个标志位,SYN比特被置为1。
因此,这个特殊报文段被称为SYN报文段。另外,客户端会随机的选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中。该报文段会被封装在一个IP数据包中,并发送给服务器。
第二步:一旦包含TCP SYN报文段的IP数据保护到达服务器主机,服务器会从该数据保护中提取出TCP SYN报文段,为该TCP连接分配缓存和变量,并向该客户TCP发送允许连接的报文段,这个连接也不应该包含应用层数据。
但是,在报文段的首部却包含3个重要的信息。首先,SYN比特被置为1。其次,该TCP报文段的确认字段被置为client_isn+1。最后,服务器选择自己的初始序号(server_isn),并将其放置到TCP报文段首部的序号字段中。
这个允许连接的报文段实际表明了:“我收到了你发起建立连接的SYN分组,该分组带有初始序号client_isn。我同意建立该连接。我自己的初始序号是server_isn”。允许连接的报文段有时被称为SYNACK报文段。
第三步:在收到SYNACK报文段后,客户端要给该连接分配缓存和变量。客户主机则向服务器发送另一个报文段,这最后一个报文段对服务器的允许连接的报文段进行了确认。因为连接已经建立了,所以该SYN比特被置为0。
该三次握手的第三个阶段可以在报文段中携带客户到服务器的数据。
如何断开一条TCP连接
参与TCP连接的两个进程中的任何一个都能终止该连接。当连接结束后,主机中的资源,缓存和变量被释放。
客户应用进程发出一个关闭连接命令,这会引起客户主机TCP向服务器进程发送一个特殊的TCP报文段。这个特殊的报文段让其首部中的一个标志位即FIN比特被设置为1.当服务器接收到该报文段后,就向发送方回送一个确认报文段。
然后,服务器发送它自己的终止报文段,其FIN比特被置为1.最后,该客户对这个服务器的终止报文段进行确认。此时,在两台主机上用于该连接的所有资源都被释放了。
客户TCP经历的典型的TCP状态序列
客户TCP开始时处于CLOSE(关闭)状态。客户的应用程序发起一个新的TCP连接。引起客户中的TCP向服务器中的TCP发送一个SYN报文段。在发送过SYN报文段后,客户TCP进入了SYN_SEND状态。
当客户TCP处于SYN_SEND状态时,他等待来自服务器TCP的对客户端所发报文段进行确认且SYN比特被置为1的一个报文段。收到这样一个报文段之后,客户TCP进入ESTABLISHED(已建立)状态。当处在ESTABLISHED状态时,TCP客户就能发送和接收包含有效载荷数据的TCP报文段了。
假设客户应用程序决定要关闭该连接。(注意服务器也能关闭该连接)这引起客户TCP发送一个带有FIN比特被置为1的TCP报文段,并进入FIN_WAIT_1状态。当在FIN_WAIT_1,客户TCP等待一个来自服务端的带有确认的报文段。
当它收该报文段时,客户TCP进入FIN_WAIT_2状态。当处在FIN_WAIT_2状态时,客户等待来自服务器的FIN比特被置为1的另一个报文段。当接收到该报文段后,客户TCP对服务其的报文段进行确认,并进入TIME_WAIT状态。
经过等待30秒后,连接就正式关闭,客户端所有资源都被释放,包括端口号。
服务器端TCP经历的典型TCP状态序列
这些状态都是自解释的。