首先介绍一下位码:
位码就是tcp标识位,有6种
- SYN(synchronous) 建立联机
- ACK(acknowledgement) 确认
- PSH(push) 传送
- FIN(finish) 结束
- RST(reset) 重置
- URG(urgent) 紧急
TCP三次握手:
简单理解: 我要连接你,你同意 ,我在连接你(成功)
详细解释:
c端 :客户端 ,s端: 服务端
第一次握手:c端向客户端发送SYN数据包(SYN =1,序列号 = x),c端进入 SYN_SENT(已发送状态),等待服务器的确认
第二次握手:s端收到SYN数据包并进行确认(SYN =1,ACK number = 序列号 +1,ACK =1 ,序列号 = y),在发送 ACK+SY到 c 端,s端进入 SYN_RCVD状态
第三次握手:c端收到 ACK+SYN,如果ACK number = x+1,将ACKnumber 变成 y+1,ACK =1 向s端发送ACK数据包,c端和s 端都进入ESTABLISHED(已连接)状态。
为什么要三次握手:
为了方式已经失效的连接请举起报文突然又传到服务端,产生错误。
解析:报文段已经发送,在摸个网络节点发生滞留,发哦值连接释放,释放后报文达到另一端。
例如:c端发送SYN报文给 s端,连接被释放后,s端收到了 报文并误认为这事c端的新连接,给c端发送 SYN+ACK,这时无法得到c端的回应,应为连接已经无效了
TCP四次挥手:
简单理解:我要关闭,你知道我要关闭,你先关闭我在关闭
A 是 客户端 B 是服务端
FIN_WAIT_1:A 发起主动关闭连接的状态(很难看到,因为发起关闭连接后,另一端回马上同意)
FIN_WAIT_2:B端同意关闭,但是还有一些数据要给A,A不能马上关闭,半连接状态
TIME_WAIT:A等2MSL后就可以关闭了(如FIN_WAIT_1时,就收到了FIN和ACK数据包则直接进入这个状态)
为什么要等2MSL,因为无法保证最后一次ACK数据包是否被对方收到,为了确保可靠性
2MSL:报文最大生存时间
CLOSED:2MSL后进入关闭状态
第一次挥手:
A给B发送FIN报文(序列号 = x) ,A进入FIN_WAIT_1状态,表示A没有数据返回给B了。
第二次挥手:
B收到FIN报文后,给A返回一个ACK(ACK number = x +1 ) A进入 FIN_WAIT_2 状态 B同意A关闭请求
第三次挥手
B向A发送FIN (序列号 = y),请求关闭连接,B进入LASK_ACK状态
第四次挥手
A收到B发送的FIN报文后 ,给B返回ACK(ACK = y +1 ),A进入TIME_WAIT状态,B接受到ACK之后关闭连接,A在2MSL后依然没有回复,证明B端已经关闭,A端可以关闭
为什么TCP要四次挥手:
TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP是全双工模式,主机1请求关闭连接,不再返送数据,但是可以接受主机2的数据,主机2不再发送数据了。才算关闭,这样减小了丢失数据的风险。