?? ??? ????A之所以还要发送一次确认是为了防止已失效的连接请求报文段突然又传送到了B导致产生错误 1)第一次握手:A的TCP客户进程也是首先创建传输控制块TCB,然后向B发出连接请求报文段,(首部的同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。 2)第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),测试TCP服务器进程进入SYN-RCVD(同步收到)状态; 3)第三次握手:TCP客户进程收到B的确认后,要向B给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,A进入ESTABLISHED(已建立连接)。 当B收到A的确认后,也进入ESTABLISHED状态。 TCB传输控制块Transmission Control Block,存储每一个连接中的重要信息,如TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号。?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 断开 ? ?起初A和B处于ESTABLISHED状态——A发出连接释放报文段并处于FIN-WAIT-1状态——B发出确认报文段且进入CLOSE-WAIT状态——A收到确认后,进入FIN-WAIT-2状态,等待B的连接释放报文段——B没有要向A发出的数据,B发出连接释放报文段且进入LAST-ACK状态——A发出确认报文段且进入TIME-WAIT状态——B收到确认报文段后进入CLOSED状态——A经过等待计时器时间2MSL后,进入CLOSED状态。 TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。? 简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例: 1.服务器读通道关闭 2.客户机写通道关闭 3.客户机读通道关闭 4.服务器写通道关闭 关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。 详细过程: ????第一阶段?? 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i; ??? 1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道; ??? 2.客户机收到ACK(i+1)后,关闭客户机写通道; ???(此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据) ????第二阶段?服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j; ??? 3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道; ??? 4.服务器收到ACK(j+1)后,关闭服务器写通道。 这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。 ? ? ?(之所以断开需要四次是因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。只有等到Server端所有的报文都发送完了,才能发送FIN报文,因此不能一起发送。)
?
|