TCP协议:三次握手四次挥手

TCP协议

先说一下什么是初始序列号:

初始序列号它是有专业术语表示的,初始序列号的英文名称是Initial sequencenumbers(ISN), 所以我们上面表示的seq = v,其实就表示的ISN。在发送SYN之前,通信双方会选择一个初始序列号。初始序列号是随机生成的,每一个TCP连接都会有一个不同的初始序列号。RFC 文档指出初始序列号是-一个32位的计数器,每4 us (微秒) + 1。因为每个TCP连接都是一个不同的实例,这么安排的目的就是为了防止出现序列号重叠的情况。当一个TCP连接建立的过程中,只有正确的TCP四元组和正确的序列号才会被对方接收。这也反应了TCP 报文段容易被伪造的脆弱性,因为只要我伪造了-一个相同的四元组和初始序列号就能够伪造TCP连接,从而打断TCP的正常连接,所以抵御这种攻击的一种方式就是使用初始序列号,另外-种方法就是加密序列号。

进入正题

TCP连接的建立和终止

在发送数据前,相互通信的双方(既发送方和接收方)需要建立一条连接,在发送数据后,通信双方需要断开连接,这就是TCP连接的建立和终止。

TCP协议:三次握手四次挥手_第1张图片

TCP建立连接-三次握手

TCP协议:三次握手四次挥手_第2张图片

1.服务端进程准备号接收来自外部的TCP连接,一般情况下是调用bind、listen、socket、三个函数完成。这种打开方式被认为是被动打开(passive open)。然后服务端进程处于LISTEN状态,等待客户端连接。

2.客户端通过connect发起主动打开(active open),向服务器发出连接请求,请求中首部筒不位SYN = 1,同时选择一个初始序号sequence,简写seq=x。SYN报文段不允许携带数据,只消耗一个序号。此时客户端进入SYN-SEND状态。

3.服务器收到客户端连接后,需要确认客户端的报文端,在确认报文段中,吧SYN和ACK位都置为1。确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号,此时,TCP服务器进入SYN-TECEIVED(同步收到)状态。

4.客户端在收到服务器发出的响应后,还需要给出确认连接。确认连接中的ACK置为1,序号为seq=x+1,确认号为ack=y+1。TCP规定,这个报文段可以携带数据也可以不携带数据,如果不携带数据,那么下一个数据报文段的序号仍是seq=x+1。这时,客户端进入ESTABLISHED(已连接)状态。

5.服务器收到客户端的确认后,也进入ESTABLISHED状态。

这是一个典型的三次握手过程,通过上面3个报文段就能完成一个TCP连接的建立。三次握手的目的不仅仅在于让通信双方知晓正在建立一个连接,也在利用数据包中的选项字段来交换一些特殊信息,交换初始序列号。

一般首个发送SYN报文的乙方被认为是主动打开一个连接,而这一方通常也被称为客户端。而SYN的接收方通常被称为服务端,它用于接收这个SYN,并发送下面的SYN,因此这种打开方式是被动打开。

TCP断开连接-四次挥手

数据传输结束后,通信双方可以释放连接。数据传输结束后的客户端主机和服务端主机都处于ESTABLISHED状态,然后进入释放连接的过程。

TCP协议:三次握手四次挥手_第3张图片

1.客户端应用程序发出释放连接的报文段,并停止发送数据,主动关闭TCP连接。客户端主机发送释放连接的报文段,报文段中首部FIN位置为1,不包含数据,序列号位seq = u,此时客户端主机进入FIN-WAIT-1(终止等待1)阶段。

2.服务器主机接收到客户端发出的报文段后,既发出确认应答报文,确认应答报文中ACK=1,生成自己的序号位 seq = v,ack = u+1,然后服务器主机就进入CLOSE-WAIT(关闭等待)状态。

3.客户端主机收到服务端主机的确认应答后,即进入FIN-WAIT-2(终止等待2)的状态。等待客户端发出连接释放的报文段。

4.这时服务端主机会发出断开连接的报文段,报文段中ACK=1,序列号seq=v,akc = u+1,在发送完断开请求的报文后,服务端主机就进入了LAST-ACK(最后确认)的阶段。

5.客户端能收到服务器的断开连接请求后,客户端需要作出响应,客户端发出断开连接的报文段,在报文段中,ACK=1,序列号seq = u+1,因为客户端从连接开始到断开后就没再发送过数据,ack = v+1,然后进入到TIME-WAIT(时间等待)状态,请注意,这个时候TCP连接还没有释放。必须经过时间等待的设置,也就是2MSL(在linux中1msl是30秒)后,客户端才会进入CLOSED状态,时间MSL叫做最长报文段寿命(Maxiumum Segment Lifetime)。

6.服务端主要收到了客户端的断开连接确认后,就会进入CLOSED状态。因为服务端结束TCP连接时间要比客户端早,而整个连接断开过程需要发送四个报文段,因此释放连接的过程也被称为四次挥手。

TCP连接的任意一方都可以发起关闭操作,只不过通过长情况下发起关闭连接操作一般都是客户端。然而,一些服务器比如Web服务器在对请求作出响应后也会发起关闭连接的操作。TCP协议规定通过发送一个FIN报文来发起关闭操作。

TCP和半开启、半关闭以同时打开同时关闭我就不作为重点多做解释了。

给大家展示一下完整的三次握手四次挥手以及他们的状态转换图:

TCP协议:三次握手四次挥手_第4张图片
TCP协议:三次握手四次挥手_第5张图片

你可能感兴趣的:(linux网络编程,tcp/ip,网络,服务器)