学习计算机网络中的一些疑问及解答

news/2024/6/1 16:27:07 标签: 学习, 计算机网络, 网络, 程序人生

文章目录

  • 前言
  • 一、为什么要进行三次握手
  • 二、三次握手的流程
  • 三、三次握手中seq和ack的值
  • 四、四次挥手流程
  • 五、四次挥手中seq和ack的值
  • 六、为什么要等待才回复
  • 七、为什么等待2MSL
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招,在学习网络>计算机网络的过程中遇到了一些问题,思考并解答。
部分参考小林大佬的解答 :小林coding

一、为什么要进行三次握手

因为三次握手才能保证双方具有接收和发送的能力。
三次握手才可以阻止重复历史连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费

通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

二、三次握手的流程

请添加图片描述

  1. 一开始,客户端和服务端都处于CLOSE状态。先是服务端主动监听某个端口,处于 LISTEN状态。
  2. 然后客户端主动发起连接 SYN,之后处于 SYN-SEND 状态。此时发送的是一个特殊的TCP报文段,该报文段不包含应用层数据,但是在报文段的首部中的一个标志位被置为1,会随机选择一个初始序号client_sin,该报文段也称SYN报文段。
  3. 服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于SYN-RCVD 状态。该报文段SYN比特被置为1,首部的确认字号段被置为client_sin + 1,并选择自己的初始序号(server_isn)将其放置到TCP报文段首部的序号字段中,该报文段也称SYNACK报文段。。
  4. 客户端收到服务端发送的 SYN 和ACK 之后,发送 ACK的 ACK,之后处于ESTABLISHED 状态,因为它一发一收成功了。该SYN比特置0,确认号字段server_isn+ 1,初始序号为client_sin + 1,并且可以在报文段负载中携带客户到服务器的数据。
  5. 服务端收到 ACK的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。

三、三次握手中seq和ack的值

seq(初始序号)与ack(确认号)
一次:client_sin,暂无
二次:server_isn,client_sin + 1
三次:client_sin + 1,server_isn + 1

四、四次挥手流程

请添加图片描述

  1. 主动方打算关闭连接,此时会发送一个 TCP首部 FIN 标志位被置1的报文,也即 FIN报文,之后主动方进入 FIN WAIT_1 状态。
  2. 被动方收到该报文后,就向主动方发送 ACK应答报文,接着被动方进入 CLOSED_WAIT 状态。
  3. 主动方收到被动方的 ACK 应答报文后,之后进入 FIN WAIT 2状态
  4. 等待被动方处理完数据后,也向主动方发送FIN 报文,之后被动方进入 LAST_ACK 状。
  5. 主动方收到被动方的 FIN 报文后,回一个ACK 应答报文,之后进入 TIME WAIT 状态。
  6. 被动方收到了 ACK 应答报文后,就进入了CLOSED 状态,至此被动方已经完成连接的关闭。
  7. 主动方在经过 2MSL 一段时间后,自动进入CLOSED 状态,至此主动方也完成连接的关闭。
    但是在特定情况下,四次挥手是可以变成三次挥手的

五、四次挥手中seq和ack的值

seq(初始序号)与ack(确认号)
一次:client_sin,server_isn + 1
二次:server_isn + 1,client_sin + 1
三次:server_isn + 2,client_sin + 1
四次:client_sin + 1,server_isn + 3

六、为什么要等待才回复

防止历史连接中的数据,被后面相同四元组的连接错误的接收;
保证「被动关闭连接」的一方,能被正确的关闭;

七、为什么等待2MSL

最后一个等2MSL(一个MSL是报文段的最大存活时间),2MSL保证最后一个ACK对方一定收到。
网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。
可以看到 2MSL时长 这其实是相当于至少允许报文丢失一次。

总结

网络初学,主要是为了CSAPP的最后一个Lab,以后有时间考虑看看CS144(网络这方面我当时学的是真的菜)。


http://www.niftyadmin.cn/n/5032156.html

相关文章

linux后台开发面试题

网络 网络的字节序网络知识 tcp三次握手 各种细节 timewait状态tcp 与 udp 区别 概念 适用范围TCP四次挥手讲一下过程,最后一次ack如果客户端没收到怎么办,为什么挥手不能只有三次,为什么time_wait。对于socket编程,accept方法是…

华为云云耀云服务器L实例评测|基于华为云云耀云服务器L实例搭建EMQX大规模分布式 MQTT 消息服务器场景体验

文章目录 前言一、😄华为云云耀服务器二、😄产品实例创建相关1、🧨开通华为云云耀服务器2、🧨创建华为云云耀服务器实例3、🧨终端登录4、🧨华为云云耀云服务器密码重置 三、😄安装开源产品EMQX四…

【数字人】1、SadTalker | 使用语音驱动单张图片合成视频(CVPR2023)

Sad Talker:使用一张图片和一段语音来生成口型和头、面部视频 论文:SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation 代码:https://github.com/Winfredy/SadTalker …

安卓逆向 - Xposed入门教程

一、引言 Xposed框架,是Android中Hook技术的一个著名的框架,拥有非常丰富的模块,给我们分析app提供了极大的便利,Xposed框架是开源的。最高支持到Android 8(重要) github地址:GitHub - rovo89…

Haproxy集群调度器与部署

目录 一、Haproxy介绍: 1.Haproxy应用分析: 2.Haproxy的特性: 3.Haproxy常见的调度算法: 4.LVS、Nginx、HAproxy的区别: 4.1 Haproxy与lvs对比: 4.2 Haproxy与nginx对比: 5. Haproxy优点&#x…

Springboot 实践(18)Nacos配置中心参数自动刷新测试

前文讲解了Nacos 2.2.3配置中心的服务端的下载安装,和springboot整合nacos的客户端。Springboot整合nacos关键在于使用的jar版本要匹配,文中使用版本如下: ☆ springboot版本: 2.1.5.RELEASE ☆ spring cloud版本 Greenwich.RELEASE ☆ sp…

从输入一个网址到浏览器页面展示到底发生了什么

从输入一个网址到浏览器页面展示到底发生了什么 1. HTTP 解析URL 首先浏览器做的第一步工作就是解析URL,从而生产一个发送给服务器的请求信息。 URL是什么呢,见下图: 图中长长的URL实际上是请求服务器里的文件资源。 要是上图中的蓝色部分…

Python入门教学——self

1、简介 我们知道在创建类的实例方法时,需要传入一个self,不然就会报错。那么这个self是什么呢?有什么作用呢? def 方法名(self,args): # args为参数pass 在Python类中规定,函数的第一个参数是实例对象本身&#xff…