前言
🌟🌟本期讲解关于TCP协议的重要的机制"连接的建立和断开"~~~
🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客
🔥 你的点赞就是小编不断更新的最大动力
🎆那么废话不多说直接开整吧~~
目录
[3.CLOSE _WAIT状态](#3.CLOSE _WAIT状态)
📚️1.TCP建立连接
1.1连接概念
在之前我们知道TCP的特性之一就是"有连接的",那我们客户端建立连接是通过在应用程序中进行调用的,然后系统内核帮我们建立连接
**连接:**所谓的建立连接就是通信的双方保留对方的一些信息数据
那么这里的内核中的连接具体过程如下:
1.2如何连接(三次握手)
这里就涉及到一个TCP报文段标志位:syn;
此处的syn就是synchronize的首字母缩写,那么此时表示的就是同步的意思,但是在多线程这个场景下,我们叫做加锁;
syn:数据报的特点:
1.不携带载荷,就是没有应用层数据报
2.含有TCP 报头,IP报头,以太网数据帧,这里的TCP报头包含客户端的端口号,IP报头包含客户端的IP地址
具体三次握手过程:
那么这里小编就给大家一一解释一下吧:
1.首先客户端向服务器发起请求syn,表示我想和你建立连接;
2.然后服务会发送一个ack表示我收到了信息,然后发送syn表示我愿意建立连接
3.最后客户端最后发送一次ack表示我收到了信息;
问题一:这里的服务求对于客户端发来的请求都会接收吗?
1.一般情况下,服务求都会进行接受,因为服务器本来就是干这个的;
2.服务器负载极高的境况下,无法进行响应,因为客户端发送过来的请求太多了 ;
问题二:这里的syn在不同场景下的区别
1.在多线程环境下:
这里的synchronized是为了保证多线程下线程的执行顺序,保证线程安全
2.在TCP报文段中:
这里的syn同步是为了进入连接状态,服务器和客户端共同完成一系列工作
问题三:这里的三次握手体现在哪里,不是四次吗?
由于这里的网络传输会涉及到包的封装和分用,所以这里两个包合成一个包就会节省开销,并且这里的客户端发送的syn和ack相差的时间不多,所以就可以打包成一个
那么最终的三次握手这里的图如下:
注意补充:在三次握手的过程中"确认应答和超时重传机制"这两个特性都是存在的~~~
**握手概念:**像syn这种数据包,不携带任何数据,没有载荷,没有应用层数据包,没有任何业务逻辑的,我们就任务syn的作用就是"打招呼",形象的叫做握手~~
1.3三次握手的意义
1.第一种意义
三次握手可以针对通信路径,投石问路,确认当前的路径是否是通畅的(这是针对的中间路径)
举例:在地铁中,每天早上都有特定的地铁检修工,对地铁的观察修复后,地铁会优先空车跑一路,确认过是否通畅后,在进行接客;
2.第二种意义
三次握手也在检查发送双方的接受能力和发送能力是否正常(这是针对的通信的两端)
举例:假如双方打游戏交流连麦的时候,我会首先说"喂喂喂,听得到吗?",对方回"听到了"(此时我们就知道我的麦没有问题,然后它的耳机没有问题 )然后我再回"好的",那么此时 (我的耳机没有问题,他知道它的麦就没有问题);
3.第三种意义
三次握手也是为了协商一些重要的参数,通信是双方的事情,其中有些内容就要保持一致
这里的协商就是在选项里体现(最多40个字节) ,报头固定位20字节,然后这里的tcp报头最大就是60字节;
这里的重要一部分关键就是"通信序号"
这里的每次通信连接,通信序号相差很大,不是0,1开始的,那么就解决了一下问题:
举例:假如在三次握手四次挥手结束后,由于网络传输存在"先发后至的情况,那么就会导致一个数据堵车",在第二次三次握手通信后才传输到,那么就会由于前面的包的序号和此次的传输的包序号相差很大就会将这个数据丢弃~~~
📚️2.TCP断开连接
2.1断开连接概念
我们知道建立连接即时双方保存对端的信息,当信息太多了就会存储到数据结构中,那么下面就是断开连接的概念
断开连接:所谓的断开连接就是通过将数据结构中保存对方的信息给删除掉
注意:此处提到的断开连接需要的四次挥手是一种"和离",不是所有的断开都是四次分手,涉及到不是"和离"的,那么断开连接还有其他的方式;
2.2如何断开连接(四次挥手)
这里就涉及到一个重要的TCP报文段标志位:fin
这里的fin标志位代表的意思就是提出要断开连接了,此时注意:
这里和三次握手不一样,这里的提出带有fin标志位的TCP报文段可以是通信双方,而三次握手提出syn的只能是客户端
此时四次挥手的过程具体如下:
此时就可以看到,解释:
1.客户端发送fin标志的TCP报文段,然后这里表示我要与你断开连接
2.然后这里服务器内核自动发送ack,表示我已经收到了断开连接的信息
3.然后通过应用程序调用close实现发送fin表示我也要和你断开
4.最后客户端发送ack表示我收到消息了
此时就完成了四次挥手的操作;
1.问题一:为啥这里的中间的两步不能像三次挥手一样进行合并的操作呢?
这里的合并只能说是"如和",一般情况下,由于fin是通过close来进行触发,假如客户端进程结束了那么就会触发close操作,而服务器内核会自动发送ack,就会导致fin通过应用程序调用,那么这两个标志位的报文段相差的时间就会比较长那么就无法进行合并了~~
2.问题二:这里的四次挥手和三次握手的区别与相似点是什么?
1.相似之处:
两种都会给对方发送一个fin/syn,然后给对方返回一个ack;
发送的顺序都是:syn/ack/syn/ack,与fin/ack/fin/ack,然后这里中间的位置都是同一台机器发送的~~~
2.不同之处:
这里的不同之处即:三次握手中间部分一定能合并,然后四次挥手中间部分不一定能合并;
三次握手一定是客户端发起的,四次挥手不一定是客户端发起的,还有可能是服务器
2.3TCP的状态的转化
1.LISTEN状态
这里表示的是服务已经执行了serverSocket,已经绑定了端口号与IP地址了,表示可以建立连接了~~~
我们通过前一期写过的TCP回显服务器来进行举例,我们启动服务器:
然后通过在命令提示符中输入:netstat -ano | findstr 3456;
C:\Users\Administrator>netstat -ano | findstr 3456
TCP 0.0.0.0:3456 0.0.0.0:0 LISTENING 12828
TCP [::]:3456 [::]:0 LISTENING 12828
可以看到此时就是LISTEN状态;
解释:从左到右是:本端,外端,状态,程序的"身份证号",此时由于没有客户端,所以这里对端就是0.0.0.0:0;
2.ESTABLISHED状态
表示客户端已经建立完毕,三次握手已经完成了,准备通信了~~
这里我们就直接启动客户端:
那么此时继续使用刚才的命令:
C:\Users\Administrator>netstat -ano | findstr 3456
TCP 0.0.0.0:3456 0.0.0.0:0 LISTENING 12828
TCP 127.0.0.1:3456 127.0.0.1:61966 ESTABLISHED 12828
TCP 127.0.0.1:61966 127.0.0.1:3456 ESTABLISHED 10376
TCP [::]:3456 [::]:0 LISTENING 12828
那么此时就可以看到,中间部分已经建立了链接标志,此时表示的就是本机的端口,本机随机分配的端口;
3.CLOSE _WAIT状态
这里表示接下来的代码要调用close来发送fin,这里是为收到fin的一段进入的状态
4.TIME_WAIT状态
即本端发送fin后,等待对端发送fin,此时就进入TIME_WAIT状态
这里的TIME_WAIT状态的意义:防止最后一个ack发生丢包的,然后进行重传;
如果TIME_WAIT状态下,TCP断开连接,那么就会导致f重传fin后,无法送到ack(在) 会导致增加系统资源的开销,(这里存在确认应答与超时重传)(只有保存对端在数据结构的信息,才能建立连接,提供一系列的操作,才会返回ack)
📚️3.总结
💬💬本次小编主要讲解了关于TCP中重要的机制"三次握手,四次挥手" 的重要操作,即建立连接和断开连接,以及最后提及的TCP状态的转化~~
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!
💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。
😊😊 期待你的关注~~~