本文用最简洁的语言教你理解HTTP的三次握手和四次挥手,相信你看过一遍后就能掌握好,并能自己描述出来。匆忙写的,审美可能有待提升。
目录
ps:
客户端,服务端,
浅绿色背景的是你可以不用深入理解的。
浅黄色背景是为了更好理解这些符号的作用而自创的名词,并不存在。
加粗是需要记住的,相关的数值可以记住是什么意思,你记不住编一个也行
橙色是区别报文的作用而命名的
紫色是客户端/服务端进入的状态,是要牢记的
三个状态位
SYN是同步位,ACK是确认位,FIN是释放位
默认为0未激活,1为激活
SYN,ACK配套的值分别为seq,ack,代表某个数值,为了方便双方确认,以防报文出错
三次握手
首先服务端创建TCB模块(用来存储连接的信息,tcp连接表等等),并一直处于监听状态,等待客户端发送连接请求
1.客户端创建TCB模块。
建立同步段,同步位SYN设为1,设置一个初始序号seq设为x(数值不确定)
发送连接请求报文,进入同步已发送状态
补充:序号是tcp报文首部里的一个字段,用来标志数据的起始位置
2.服务端收到报文后,如果同意建立连接,
建立确认段,将确认位大写ACK设为1,小写ack设为x+1,表示正确收到了客户端的连接请求报文。
建立同步段,将同步位SYN设为1,seq设为y(数值不确定)
补充:如果有提及四次握手,就是在这分开,先发送确认报文,再发送同步报文,效果等同
发送确认报文,进入同步收到状态
3.客户端收到报文后。
建立确认段,将确认位大写ACK设为1,小写ack设为y+1,表示收到了服务端的确认报文。
加上自己的序号seq为x+1
发送确认报文,进入已建立联系状态
服务端收到报文后,进入已建立联系状态
四次挥手
1.客户端发送连接释放报文。
建立释放段,将释放位FIN设为1,seq设为u(等于客户端发送的数据最后一个字节的序号+1),
进入终止等待1状态
2.服务端收到报文后。
建立确认段,将确认位大写ACK设为1,小写ack设为u+1,
发送确认报文,表示正确的收到了连接释放请求报文。
服务端进入关闭等待状态,
客户端收到报文后,进入终止等待2状态,
3.服务端在接下来的过程中,可能还有数据要发送给客户端,等没有数据要发了。
建立释放段,将释放位FIN设为1,seq设为w(等于服务端发送的数据最后一个字节的序号+1),
建立确认段,将确认位大写ACK设为1,小写ack设为u+1,重复发送是为了表示没有数据需要发送,准备释放连接。
发送释放报文后进入最后确认状态
4.客户端收到报文后,
建立确认段,将确认位大写ACK设为1,小写ack设为w+1,表示收到了释放报文的最终确定,
并向服务端发送确认报文,
客户端进入时间等待状态,
进入这个状态是为了报文丢失时超时重传,为了确保服务端能收到确认报文,增加了定时器,如果定时器时间到了,服务端没收到确认报文,会再次发送释放报文,客户端收到后定时器重置,再次发送确认报文,
定时器时间到了,客户端不再收到服务端的释放报文,客户端才进入释放连接状态
服务端收到报文后,进入释放连接状态
到此,便是大概的流程。实际流程比较复杂,比如报文可能延迟到达,报文丢失需要使用超时重传等等。但这都不是我们重要关注的点。