网络编程三TC三次握手和四次挥手

1.TCP数据被封装在一个IP数据包中,该IP数据包包括IP首部、TCP首部、TCP数据三部分。

而在TCP首部中包含了各种信息。此次主要关注其中的标志位,TCP首部的编制位中包含6个标志位。他们中的多个可被同时设置为1,含义分别为

(1)URG:紧急指针有效(2)ACK:确认序号有效(3)PSH:接收方应该尽快将这个报文交给应用层(4)RST:重置连接(5)SYN:同步序号用来发起一个连接(6)FIN:发送端完成发送任务

2.为了建立一条TCP连接需要一下三个步骤:即三次握手

(1)客户端(发起连接端)发送一个SYN报文段指明客户端打算连接的服务器端口号以及初始序号,SYN请求发送以后,客户进入SYN_SENT状态。

(2)服务器启动后首先进入LISTEN状态,当他接收到客户发来的SYN请求之后,进入SYN_RCV状态,发回包含服务器的初始序号的SYN报文作为应答。同时将确认序号设置为客户的初始序号加1,对客户的SYN报文段进行确认。一个SYN将占用一个序号。

(3)客户确认接收到服务器的确认报文后进入ESTABLISHED状态。表明本方连接已成功建立。客户将确认序号设置为服务器的ISN加1,对服务器的SYN报文段进行确认,当服务器接收到该确认报文后,也进入ESTABLISHED状态。

3.一般由客户决定何时终止,因为客户进程通常由用户交互控制。

因为TCP连接是全双工的(即数据在两个方向上能同时传递),那么每个方向必须单独关闭。终止一个连接要经过四次交互,当一方完成他的数据发送任务后,发送一个FIN报文来终止这个方向的连接。当另外一端接收到FIN,他必须通知应用层另外一端已经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。

4.TCP的终止:四次握手

在客户端close时完成 服务器端    <-----------FIN=n-------     客户端  (close)

                                                ---------ACK=n+1---------->//服务器端告诉客户端他知道客户端要关闭了  但是可能还有没完成的,过一会close 所以ACK和FIN分开发

FIN表示通知对方本端要关闭了    -------------FIN=m----------->//未完成的完成了,告诉客户端关闭吧

                                               <-----------ACK=m+1------

从图示中我们可以看出当客户端接收到服务器端关闭的FIN报文后并没有直接关闭连接而是进入TIME_WAIT状态,而且这个状态会保留两个最大段生存时间(2MSL),等待2MASL时间之后,客户也关闭连接并释放它的资源。

设立TIME_WAIT的两个目的:

①当由主动关闭方发送的最后ACK丢失并导致另外一方重新发送FIN时,TIME_WAIT维护连接状态。从此来看TIME_WAIT状态延长了TCP对当前连接的维护信息,对于正确处理连接的正常关闭过程中确认报文丢失是很有必要的

②TIME_WAIT为连接中“离群的段”提供从网络中消失的时间。IP数据包在广域网传输中不仅可能会丢失也有可能会延迟。如果延迟或重传报文段在连接关闭之后到达,通常情况下TCP仅仅丢弃该数据并响应RST。当该报文段到达发出延时报文段的主机时,因为该主机也没有记录该连接的任意信息,所以它也丢弃该报文段。然而如果两个主机间又建立了相同端口号的新连接,那么离群的段就可能被看成是属于新连接的,如果离群的段中数据任何序号恰好处在新连接的当前接收窗口中,数据就会被新连接接收,结果是破坏新连接,使TCP不能保证以顺序的方式递交数据。因此TIME_WAIT状态确保了旧连接的报文段在网络上的消失之前不会被重用,从而防止其在上述情况下扰乱新连接。

5.三次握手四次挥手的原因就是:

由与TCP连接时全双工,两个方向都能发送数据,所以终止连接时两边都要终止。需要一方发送FIN代表要终止,另一方被动关闭方要发送ACK确认,以及自身关闭的FIN报文,最后由请求关闭方确认接收被动关闭方的关闭。

6.三次握手四次挥手状态转移图

6.

猜你喜欢

转载自blog.csdn.net/Monster7559/article/details/86352785