1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部FIN=1,其序号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据也要消耗一个序号。
2、服务器收到连接释放的报文,发出确认报文,ACK=1,ack=u+1,并且带上字节序列号seq=v,此时,服务器进入CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,及客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的 时间。
3、客户端收到服务器端的确认请求后,此时,客户端进入FIN-WAIT-2(终止等待2)状态,等待服务器发送链接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能有发送一些数据,假定此时的序列号为sqp=w,此时,服务器就进入LAST-ACK(最后确认)状态,等待客户端的确认。
5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的徐磊好是seq=u+1,此时,客户端就进入2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的书简要比客户端早一些。
4、TCP的通讯原理 ⑴、Socket套接字Socket的愿意是“插座”,在计算机通信领域,scoket被翻译成“套接字,它是计算机之间进行通信的一种约定或一种方式”。通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。TCP用主机的IP地址加上主机的端口号作为TCP连接的端点,这种端点就叫做套接字(scoket)。
区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。通过将3个参数结合起来,与一个“插座”socket绑定,应用层就可以和传输层套接字接口区分来自不同应用进程或网络连接的通信,实现数据传输的并发服务。
套接字对是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。套接字对唯一便是一个网络上的每个TCP连接。
⑵、TCP缓冲区每个TCP的socket的内核中都有一个发送缓冲区和一个接受缓冲区。现在我们假设用write()方法发送数据,使用read()方法接受数据。
Write()并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们合适发送到网络,这些都是TCP协议负责的事情。
TCP协议独立于write()函数,数据有可能刚被写入缓冲区就被发送到网络,也可能在缓冲区不断积压,多次写入的数据被一次性发送到网络,这就取决于当时的网络情况、当前线程是否空闲等诸多因素,不有程序员控制。
Read()也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。
总的来说,I/O缓冲区自在每个TCP套接字中单独存在;I/O缓冲区在创建套接字时自动生成。
TCP的可靠性性