包含了客户端与服务器建立连接的流程
前言
三次握手、四次挥手协议是TCP建立和断开连接的重点,也是面向连接的体现,可以说是每年面试必问题之一。
(真正在建立连接时,三次握手,前两次是没有携带数据的,发送的只是一些确认报文,这个我们会详细介绍,现在只是帮助我们理解三次握手和四次挥手)
一、三次握手是什么?
我们把TCP建立连接的过程,想象成男女朋友之间建立关系的过程。
断开连接的过程,想象成男女朋友分手的过程。见:四次挥手
男生比作:客户端。女生比作:服务器。
这里我们就按一般情况分析下:大多数都是男生主动追求女生。女追男的那种情况那就是隔层纱了,我们把这种就当作是UDP建立连接的过程吧,再下一篇文章中进行讨论,喜欢这种方式的同学可以观看我们的TCP与UDP。
既然是男生追女生,那么直男一般都是怎么表达的呢?
首先男女生应该都是有想要社交这个准备的。(服务器、客户端socket的创建)
前期准备:
①首先的加到女生VX吧。(知道对方的IP地址和端口号);
②这里我们VX的媒介比作(TCP连接时采用的流式套接字);
③当然女生也不能经常换手机和微信号吧,都有固定手机和VX号(bind:IP和端口绑定),老换男生也找不着不是;
④这时候男女生互相喜欢了,女生一般都比较期待男生给自己发消息或者表白什么的(listen监听),期待的同时女生一般也处于准备接受这个男生的阶段(accept接收连接);这也是我们一般建立连接时为什么要先打开服务器,再打开客户端的原因之一。
等差不多该建立关系了--------男生发消息了
- 第一次握手:男生发消息了:我喜欢你->XXX♥♥♥做我女朋友吧!(客户端:connect)。
- 第二次握手:女生一般比较委婉---收到消息后呢回复男生->要不我们先处处吧。
- 第三次握手:男生这边收到消息的回复一下女生->嗯嗯,那我们处处,女生也收到答复了。
这个过程中成不成主要也得看女生的意愿了不是;(服务器:accept的返回值)成功:记住你VX号或者名字(通常>0一个描述符),失败:拉倒呗(返回-1),为什么不返回0:0是啥呀到底同意还是拒绝呢(其实0也是描述符之一已经被用了)
关系确立了:后面男女生之间就可以交往了。(send、recv)
这里有旁边的闺蜜就说了,这合适吗?那我们帮他们分析下。。。
1.2为什么要握三次?两次、四次呢?
两次:女生说->我们先处处,然后也一直等,一直等,一直等。。。。(等到海枯石烂?)也等不到男生的回复,这样的关系能建立起来吗,一般不太可能?
四次:那女生在说完我们先处处后再说点什么呢?其实我也喜欢你或者我其实不喜欢男的,男生还没回复呢,再说的话是不是有些多余!
所以说三次正正好!
详细介绍:
TCP传输层协议中,客户端与服务器间建立连接,采用三次握手机制。
我们先来认识下这些专有名词都是什么意思,以及他们的作用(一般面试不太问,大致过一遍就可以!):
标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等。
这里我们就只介绍下图中几个:
1)seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。(简单说就是客户端和服务器端各自发起时用来计数的!)
2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(这个就是接收方收到信号后确认用的,它的序号和发起序号有关的!接收到信号之后,先把ACK置1,才能产生小写的ack。不要将确认序号ack与标志位中的ACK搞混了。)
SYN | 请求号标记位 |
ACK | 确认号标记位 |
建立连接过程(三次握手的过程):
SYN:发起新链接,看图,一般就刚开始一端出现一个,后面只要不产生新的连接就不会再有了。
seq:他等于x是因为它的起始序列是随机的。但是再往后的客户方的起始序列都在它的基础上+1。服务器端的起始序列同理。
注意他俩的起始序列是两个不同的数值概念。
ACK:收到就标志为1,然后就把小写的ack确认序号根据发起方的序列号确定下来。不论发送接收都要考虑这次行动的序列号seq。
如果是新发起的记得标志位SYN。
有应答的时候记得把ACK和ack都写上。
总结
我们通俗的说明了三次握手过程,便于我们对抽象概念的理解,又从相对专业的角度说明了TCP建立连接的三次握手过程,下一篇我们将分析断开连接时的四次挥手过程。