TCP
来源:前端-网络课程
TCP面向连接,数据通讯时进行三次握手、断开链接时进行四次挥手,位于传输层,起到承上启下的作用
名词
- seq(sequence number):序列号,通过某种算法生成的,可以标识报文的顺序
- ack(acknowledgement number):确认号,ack = seq + 1
- SYN(synchronous):发起新连接
- ACK(acknowledgement):已确定序列号有效
- FIN(finish):完成
三次握手
- 首先,客户端会发送SYN报文,请求与服务端连接,还会携带一个序列号,下次发送数据时,客户端seq会+1
- 然后,服务端收到了SYN + seq字段后,也会生成一个自己的seq序列号,并会携带ACK确认号,表示已收到之前的SYN报文,还会携带一个ack,它等于客户端seq + 1
- 最后,客户端收到服务端的响应,客户端seq会通过算法,判断是否与服务端的ack值相等,如果相等,发送ACK确认号和客户端seq;还会发送一个新的ack,这个ack是服务端的seq值+1,确保一切正常
四次挥手
服务端和客户端都可以主动断开连接,此处以客户端断开连接为例
- 首先,客户端发送FIN包、生成客户端的seq序列号,随后进入wait1状态,这是第一次挥手。
- 然后,服务端收到FIN包,进入了关闭等待状态;随之向客户端使用ack验证,若验证成功,打上ACK标记;这是第二次挥手,服务端此时仍可以发送未完成的数据
- 接着,等到服务端所有任务操作完成,服务端就开始进入最后确认状态:向客户端发送FIN包并使用客户端seq验证ack;验证成功则打上ACK标记,并生成一个新的服务端序列号seq发给客户端;这是第三次挥手
- 最后,客户端进入超时等待状态2MSL(通常是1~4分钟),发送+1后的客户端seq和服务端seq验证的ack,等到后将关闭连接;服务端收到信息,验证ack成功之后打上ACK标记,随后将要关闭连接;这是第四次挥手
超时等待时间是为了保证服务端收到ACK包:假设如果没有2MSL的等待时间,ACK包丢失了,那服务端将永远不会断开连接;有了2MSL,一旦发生丢包将会进行超时重传,实现可靠连接
评论