在上一节讲过TCP是面向连接
的 什么是面向连接,面向连接就是数据通讯的时候需要进行三次握手
,断开通信的时候进行四次挥手
名词描述
1.seq(sequence number),序列号随机生成的
2.ack(acknowledgement number)确认号 ack = seq + 1
3.ACK (acknowledgement)确定序列号有效
4.SYN(synchronous)发起新连接
5.FIN (FINISH)完成
具体步骤讲解
三次握手很像对讲机通话
,一个发送,一个接受,也可以反之。
1.首先客户端会发送一个段这个段就是SYN
报文,想跟服务端
进行连接,并且会携带一个序列号
,下次发送的数据序列号还会进行+1。
2.服务端收到了SYN + seq 字段之后,服务端也会生成一个对应服务端seq序列号,这时候就会携带ACK确认号,表示之前的SYN 收到了,还会有一个小写的ack 把 客户端的seq + 1
3.客户端收到服务端的响应之后会发送一个ACK确定序列号有效,并且还会发送seq注意这里的seq会通过算法计算出来是否跟服务端的ack值相等,然后会发送一个新的ack这里的ack是服务端的seq值+1,确保一切正常。
四次挥手
1.断开连接服务端和客户端都可以主动发起我们拿客户端举例,客户端进行断开操作先发送FIN
包生成客户端的seq
序列号随后进入wait1状态
,这是第一次挥手。
2.服务端收到FIN包表示自己进入了关闭等待状态,然后向客户端使用ack验证,验证成功打上ACK标记,随后生成服务端的seq值
发送给客户端,这是第二次挥手,服务端此时还可以发送未完成的数据。
3.等待服务端所有任务操作完成之后服务端开始进入最后确认状态,向客户端发送FIN包
,并且验证ack,使用客户端第一次的seq + 1
去验证,验证成功打上ACK标记,并且生成一个新的序列号seq发送给客户端,这是第三次挥手。
4.客户端收到之后进入超时等待状态2MSL(1-4分钟)
,经过等到后客户端关闭连接,而服务端收到信息验证完成ack成功之后打上ACk
标记随后将关闭连接。
为什么需要超时等待时间?
这是为了保证服务端收到ACK包,假设如果没有2MSL的等待时间,ACK包丢失了,那服务端将永远不会断开连接,有了2MSL,如果一旦发生丢包将会进行超时重传,实现可靠连接。