TCP的三次握手与四次挥手

TCP协议

TCP全称为“传输控制协议”,是要对数据的传输进行一个详细的控制。
TCP协议段格式:
这里写图片描述

1.源/目的端口号:表示数据从哪个进程来,到哪个进程去;
2.32位序号/32位确认号:TCP中传输的数据每个字节都按序号排列/是期待收到对方下一个报文的第一个数据字节的序号
3.4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部的最大长度为15*4=60;
4.6位标志位:

 - URG:紧急指针是否有效
 - ACK:确认号是否有效
 - PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
 - RST:对方要求重新建立连接;把携带RST标识的称为复位报文段
 - STN:请求建立连接;把携带SYN标识的称为同步报文段
 - FIN:通知对方,本端要关闭了,称携带FIN标识的称为结束报文段
5.16位窗口大小:指的是通知接收方,发送本报文你需要有多大的空间来接受
6.16为校验和:发送端填充,CRC校验,接收端校验不通过,则认为数据有问题,此处的校验和不光包括TCP首部,也包含TCP数据部分
7.16位紧急指针:标识哪部分数据是紧急数据
8.40字节头部选项:长度可变,定义一些其他的可选的参数

TCP连接管理机制

在正常情况下,TCP需要经过三次握手建立连接,四次挥手断开连接。

三次握手连接过程具体如下图所示:
这里写图片描述

当客户端与服务器建立连接前,双方都处于CLOSED状态,客户端主动连接,服务器被动连接
1.服务器端先创建传输控制块TCP,随时等待客户端发起连接请求,此时服务器端处于LISTEN状态。
2.客户端创建传输控制块TCP,此时向服务器端发出连接请求,此时报文首部同步位SYN=1,新创建的序列号seq=x;此时客户端进入SYN-CENT(同步发送)状态
3.TCP服务器收到连接请求,如果同意连接,服务器发出确认报文,确认报文中SYN=1,ACK=1,ack=x+1,初始序列号seq=y,此时TCP服务器端进入SYN-RCVD(同步接受)状态
4.客户端收到确认后,向服务器给出确认,确认报文ACK=1,ack=y+1,序列号seq=y+1,此时TCP建立连接,客户端进入ESTABLISHED状态
5.当服务器收到客户端的确认后,也进入ESTABLISHED状态。

为什么是三次握手进行连接,而不是两次呢?

因为如果客户端向服务器端发出连接请求,而此时网络延迟,服务器端没有收到客户端的请求,同时,客户端也没收到服务器的确认报文,客户端便会重新发送这条报文,同时服务器和客户端经过两次握手完成连接,数据发送,断开连接,此时,之前没有发出去的连接请求因为网络通畅而发送给了服务器,此报文本该是无效的,但经过两次握手后,客户端和服务器端完成连接,浪费了资源。
如果是通过三次握手完成,此时,之前没有发出去的连接请求因为网络通畅发送给了服务器,服务器也发送了确认报文给客户端,但是客户端并没有再次发回确认报文,此时服务器认为该连接请求无效,也就无法完成连接。

TCP四次挥手断开连接
具体断开连接过程如下图所示:
这里写图片描述

1.客户端发出连接释放请求,同时停止发送数据,释放报文首部FIN=1,序列号seq=u(所接受的最后一个序列号+1),此时客户端处于FIN-WAIT-1(终止等待1)状态
2.服务器收到连接释放报文,发出确认报文,确认报文首部ACK=1,ack=u+1
,自己序列号seq=v,此时服务器端处于CLOSE-WAIT(关闭等待)状态,此时客户端-服务器端方向已经释放,处于半关闭状态,但服务器端向客户端发送数据,客户端必须得接受,此状态需持续一段时间。
3.客户端收到确认报文后,进入FIN-WAIT-2(终止等待2)状态,等待服务器端发送数据
4.当服务器向客户端发完数据后,服务器发送连接释放报文,释放报文首部FIN=1,ack=u+1,由于此时处于半关闭状态,可能服务器还发送了些数据,则自己序列号seq=w,服务器端进入LAST-ACK(最终确认)状态
5.客户端收到服务器的连接释放报文,客户端必须发出确认报文,FIN=1,ACK=1,ack=w+1,序列号seq=u+1,此时客户端进入TIME-WAIT(时间等待)状态,此时TCP还没有释放,需等待2MSL(最长报文段寿命),当客户端撤销TCP,进入CLOSED状态
6.服务器收到客户端的确认后,进入CLOSED状态,撤销TCP,结束此次连接。
由此可以看出,服务器断开TCP连接比客户端早一些。

为什么还需要等待2MSL?

1.为了保证客户端最后一次发送的确认报文能够到达服务器,该报文可能会丢失,服务器发出FIN+ACK释放连接报文,如果客户端没有收到,服务器还会重新发送该报文,客户端在2MSL时间内重新收到该报文,并且给出回应。
2.防止已经失效的报文出现,当客户端发出最后一个确认报文后,在2MSL时间内可以使连接中持续时间内产生的报文从网络中消失。

为什么是三次握手,四次挥手?

在创建连接时,服务器端先处于LISTEN状态,客户端发送连接请求报文SYN,服务器收到连接请求如同意,发送确认报文SYN+ACK给客户端。
在断开连接时,客户端发送连接释放请求FIN给服务器端,表示不再发送数据给服务器端,服务器收到后发送FIN+ACK确认报文给客户端,但此时,服务器未必将数据已经都发送给客户端,此时服务器可以立即关闭,也可以发送完数据后,再发送FIN表示同意关闭,服务器一般ACK报文与FIN报文分开发送。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值