先解释一下以下名词
SYN:Synchronized Sequence 同步位 同步报文段(位码=1,代表同步位状态成功)
序列号:Sequence Number —>随机产生
ACK:Acknowlegement 确认位也就是确认包 ---->主机产生的序列号+1
SYN_SENT:客户端已经发送完SYN数据包
SYN_RCVD:服务端已经收到SYN数据包
ESTABLISHED:已经建立了连接可以发送数据了
TCP设计核心
1、可靠性:发送者知道自己发送成没成功
2、传输效率:可靠性的前提下尽量提高传输效率
可靠性一、确认应答(保证可靠性的核心机制);
为了区分当前是应答那个数据,需要引入序号和确认序号概念
序号是给每个字节都编了号
确认序号是表示的当前序号之前的数据已经收到了
同时也意味着想发送端索要当前确认序号开始的数据
二、超时重传
也是可靠传输的最核心机制
传输一条数据没有确认应答的时候,等待一段时间,然后进行重传,重传可能会重复若干次,重传的次数越多,丢包的概率也就越小,重传的等待时间间隔,也在依次变长
三、连接管理
三次握手建立连接
四次挥手断开连接
建立连接的意义
1、双方各自试探对方看看对方是否合适和我建立连接,双方的读写数据的能力
2、双方可以在建立连接过程中协商一些必要的数据 TCP序号的基准值
================================================================================================
三次握手具体过程
客户端先发出起建立连接的请求(SYN同步报文段)
简单的图如下
复杂一点带传输数据的原理图如下
大致过程如下:
C端:客户端 S端:服务端
第一次握手:C段向S端发送SYN数据包(SYN=1,序列号=x)。C进入SYN_SENT状态,等待服务端确认
第二次握手:S端收到SYN数据包并进行确认(SYN=1,ACK number=x+1,ACK=1,序列号为y),再发送SYN+ACK数据包给C端,S段进入SYN_RCVD状态
第三次握手:C端收到SYN+ACK数据包,如果ACK number=x+1,将ACKnumber设置为y+1,ACK=1,向S端发送ACK数据包,C端和S端都进入ESTABLISHED(已连接)状态
简单来说就是:我想连你,你同意了,我再连你(OK,成功)
涉及到的重要状态:
1、LISTEN状态:服务端的状态,表示手机开机,信号良好,随时可以有人和你建立连接
2、ESTABLISHED状态:表示别人给你打电话,你接通了,建立就完成了,随时可以通信
为什么要三次握手?
为了防止已经失效的连接请求报文段又传到了服务器,产生错误。当然还与一系列安全原因相关
例如:C端发送SYN报文给S端,连接被释放后,S端才收到报文并误认为这是C端发起的新连接,给C端发送SYN+ACK报文,这是无法得到C端回应的,因为 连接已经无效
================================================================================================
四次挥手断开连接(两端皆可发起)
四次挥手过程:
A、B服务端或客户端,因为任意一方都可以发起断开连接的请求
FIN:结束
FIN_WAIT_1:A发起主动关闭连接时的状态(很难看到,因为一旦发起,另一端会马上同意)
FIN_WAIT_2:B同意关闭,但还有一些数据要给A,A不能马上关闭,半连接状态
TIME_WAITE:A等2MSL后就可以关闭了。(如果FIN_WAIT_1 时,就收到了FIN和ACK的数据包,就直接进入此状态)
===为什么等2MSL 因为无法保证最后一次ACK数据包是否被对方收到,为了保证可靠性
===2MSL:报文生存最大时间
===CLOSE:2MSL后直接进入关闭状态
第一次挥手:A给B发送FIN报文(序列号为x),A进入FIN_WAIT_1状态,表示A没有数据要给B了
第二次挥手:B收到FIN报文后,给A发送ACK报文(ACK=x+1),A进入FIN_WAIT_2状态,B同意A关闭请求
第三次挥手:B向A发送FIN报文(序列号为y),请求关闭连接,B进入LAST_WAIT状态
第四次挥手:A收到FIN报文,向B发送ACK报文(ACK=y+1),A进入TIME_WAIT状态,B收到ACK报文以后关闭连接,A在2MSL后依然没收到消息,证明B端已经关闭,A就可以关闭连接了
简单来说:我要关闭,你同意,你要关闭,我同意你先关闭我等一会儿看你没发东西了我就也关了
为啥要四次挥手
TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP是全双工模式,主机1请求关闭连接,不再发送数据了,但是可以接收主机2的数据,主机2不再发送数据了,才算关闭,这样减少丢失数据的风险