深入理解网络通信基本原理和tcp/ip协议

news2025/2/26 11:36:47

深入理解网络通信基本原理和tcp/ip协议

  • 一、计算机网络体系
    • 1,计算机网络体系结构
    • 2,网络中数据传输
      • 2.1,浏览器中输入一个url的执行流程
      • 2.2,数据在网络中是的传输流程
    • 3,三次握手和四次挥手
      • 3.1,三次握手
        • 3.1.1,洪范攻击
        • 3.1.2,为什么需要三次握手
      • 3.2,四次挥手
        • 3.2.1,为什么需要time-wait
        • 3.2.2,time-wait举例
    • 4,UDP协议

一、计算机网络体系

1,计算机网络体系结构

在最初的网络中,是借鉴于这个OSI七层网络模型,而在实际开发应用中,更多的还是使用这个TCP/IP模型,分别是 物理层、数据链路层、网络层、传输层、应用层 ,相较于OSI模型,TCP/IP模型是将会话层和表示层都结合到了应用层里面

TCP的缩写是 Transmission Controller Protocol ,看到第一个单词传输,因此得知这个TCP是在这个传输层的;IP的缩写是 Internet Protocol ,该协议是位于网络层的,中文将这两个名字称为是 传输控制协议/英特网互联协议 。如下图,应用层中有HTTP,Telnet、DNS等协议;传输层中包含TCP、UDP协议;网络层中包含 IP、ICMP等协议;链路层中包含PDN、PPP等协议

在这里插入图片描述

在应用中,还是TCP、UDP和IP这三者使用的范围最广。

  • ip用于确定是哪台主机,有点类似于电话号码,确定能打到那个人身上

  • TCP是一个可靠连接的一个协议,需要通过三次握手建立连接,有点类似于两台电话,必须接通才能通话。绝大多数场景下还是通过tcp协议完成的,因为该协议相对稳定可靠,需要等建立连接之后才能传输数据,并且在传输数据时可以通过一定的限流方式进行流量控制,从而保证数据传输的可靠性。

  • UDP是一个面向无连接的协议,类似于商家和快递,商家不关心用户能不能接收到,不需要和用户建立直接关系。如在实际开发中,视频语言等都是通过UDP实现的,允许部分数据丢失。如虎牙斗鱼这些,有对应的清晰度,通过不同的清晰度,决定每次传输数据的大小,清晰度越小,即使丢包也是允许的

2,网络中数据传输

2.1,浏览器中输入一个url的执行流程

url:被称为统一资源定位符,一个完整的url,都会包含这四部分,分别是协议、域名、路径和资源。当在浏览器中输入一个url时,如在浏览器中输入www.baidu.com,其内部会执行的流程如下:

  • 首先是域名解析,就是将网址解析成具体的ip。如果不是第一次访问这个网址,那么正常会在host文件中保存对应的ip,那么就可以直接通过本地的host文件解析;如果是第一次访问这个网址,那么本地host文件中不存在,就需要去本地的DNS服务器查找,没有再去root根DNS服务器中获取
  • 再获取到这个具体的ip之后,通过三次握手的方式,与对方建立TCP的可靠连接
  • 建立连接成功之后,再向服务器发送一个http的请求
  • 服务器接收到请求之后,服务器会处理相关请求
  • 随后服务器会将响应结果返回给客户端
  • 随后通过四次挥手断开连接
  • 浏览器接收到响应之后,对响应的内容进行解析
  • 浏览器将解析的内容渲染,如css,js等,最后进行布局展示

2.2,数据在网络中是的传输流程

在网络通信中,客户端A需要向客户端B发送数据,也是需要通过tcp/ip 五层协议的,如下图,如主机A向主机B中发送一条数据

主机A发送数据的流程

  • 首先数据会先经过应用层,然后携带一个应用层的头部,此时为数据包
  • 随后继续经过传输层,由于是TCP协议,因此继续携带一个TCP的头部,此时为数据段
  • 随后继续经过ip层,因此继续携带一个IP层的头部,此时为数据报
  • 随后到达链路层,最后将数据封装成以太网数据帧,随后通过以太网电缆传输到目标ip

主机B接收数据的流程

  • 在通过电缆接收到数据之后,会先经过数据链路层层层解析,从下往上依次解析,先经过链路层,随后网络层,随后传输层,再到应用层,全部解析完成之后,再返回给客户端

在这里插入图片描述

3,三次握手和四次挥手

3.1,三次握手

在tcp建立连接时,需要通过三次握手来实现连接,从而实现这种稳定可靠性,其流程如下

  • 首先客户端会向服务端发送一个SYN=1的一个报文标志,并且设置一个seq_no的字段值为10000,此时客户端进入一个 SYN_SENT 的状态
  • 服务端在接收到这个请求之后,会对客户端进行一个响应,也会发送一个SYN=1的报文,并且设置一个ACK=1的标志位,同时会返回一个ack_no回应客户端的seq_no,值为客户端seq_no的值+1,最后还会设置一个seq_no的值,其值为30000。此时服务端进入一个SYN_REVD的状态
  • 客户端在接收到服务端的响应之后,客户端需要给服务端一个响应,告诉服务端客户端接收到这个响应了。会继续返回一个SYN=1的报文,并且只需要返回一个ack_no,其值为服务端seq_no的值+1,最后服务端和客户端的状态都变为 ESTABLEISHED 连接建立的状态

在这里插入图片描述

三次握手主要的原因是为了建立可靠连接,在连接过程中,客户端的seq序列号需要服务端的ack序列号应答,服务端的seq序列号也需要客户端的ack序列号应答保证可靠性,如出现丢包重传的的话,那么可以直接根据具体的seq序列号进行重传即可。主要是通过超时重传机制应答确认机制 来保证可靠传。

最后一次握手是为了告知服务端,客户端确实收到了服务端的响应,对于响应syn_no的seq_no的值,至于要加多少,取决于接收了多个包,即取决于SYN的值的大小,如果接收了3个包,且seq_no的值为10000,那么响应的ack_no的值则为10003

3.1.1,洪范攻击

SYN洪范攻击的定义如下:就是通过网络所在的端口发送大量伪造原地址的攻击报文发送到服务端,造成服务端上面的半开连接队列被占满,从而阻止其他用户进行访问。

在三次握手中,也存在一定的缺陷,有可能会出现这个SYN洪范攻击 ,就是利用伪造的ip地址向服务端发出第一次握手,而tcp连接为了维护三次握手,就会响应这个伪造ip的请求,然而服务端这边一直在等客户端的响应,即第三次握手,如果伪造服务端一直不响应,随着伪造ip请求的增多,那么服务端的资源会被耗尽。该方式属于一种ddos的攻击,可以通过加防火墙等避免,设置定时任务去移除无法响应的请求。

在三次握手中,会存在大量的客户端去连接服务端,服务端会将不能及时响应的客户端的请求,先存放在一个队列中。那么洪范攻击就会利用这个特性,从客户端发送一个伪造的数据报文到服务端,服务器会为了保证三次握手,就会对这个伪造数据的服务器做出响应,由于攻击者的ip是伪造的,那么服务器这边的响应就一直到达不了伪造者客户端的ip,并且接收不到客户端的第三次响应,导致该次连接一直不被释放。那么伪造多个ip去请求服务端的话,那么会造成大量的连接处于不被释放状态,从而让这个队列占满,导致整个服务器处于瘫痪的状态。

解决这个洪泛攻击的方案如下:

  • 无效连接监控释放:就是给一个监听事件,对队列中要响应的请求进行监听,如果在一定的时间内还没有成功的建立三次握手,那么就可以直接将该次请求释放清理掉
  • 延缓TCP分配方法: 就是在分配tcp的时候,在三次握手建立成功之后,再来分配tcp
  • 开启防火墙: 通过防火墙来确认这个客户端ip地址的有效性,只有这个ip地址是有效的才与客户端建立连接
3.1.2,为什么需要三次握手

上面讲解了三次握手的过程以及三次握手的缺陷,然而在tcp协议中,为什么建立连接需要三次握手呢,其主要原因如下:在建立连接过程中双方都会发送一个序列号,这样就可以知道发送报文的起始的序列号和最终的序列号,从而通过序列号的值知道有哪些报文,通过差值确认报文的个数,当服务端接收的报文的个数小于差值时,就通过序列号确定哪个报文被丢失,就会进行重传的操作,从而来保证该协议的可靠性

如在服务端给客户端发送建立连接时,seq_no的值设置成10000,SYN的值设置成3,但是服务端这边返回ack_no的值为10002,此时差值为2表示只收到两个数据包,但是SYN的值为3表示发送了3个数据包,故而得知少了一个服务端少接收了一个数据包,那么服务端这边就会进行重发的操作。服务端响应客户端也会发一个seq_no的序列号给客户端,然后客户端回应服务端一个ack_no,其本质也是一样,通过差值和SYN的值进行比较,查看是否出现丢包的情况。

3.2,四次挥手

当tcp连接断开时,其底层也是通过四次挥手的方式来断开连接。与建立连接的三次握手不一样,三次握手是固定的从客户端发起握手的请求,但是四次挥手不一样,挥手是客户端和服务端都可以发起断开连接的请求。四次挥手的流程如下(以客户端发起断开请求为例)

  • 首先客户端发起断开连接的请求,此时会向服务端发送一个FIN的标志,并且会设置序列号seq_no,假设此时FIN的值为,seq_no的值为8888,此时客户端处于FIN_WAIT_1的状态
  • 服务端接收到请求之后,服务端会先响应一个接收到该请求的响应,会往服务端发送一个ACK确认的标志,同时返回一个ack_no的值,改值为接收到的序列号+FIN传过来的包的数量,如此时为8889,此时服务端处于close_wait的状态
  • 一段时间之后,服务端会向客户端再次发送一次报文,也会设置一个FIN的值和一个seq_no的值,如设置一个FIN=1,seq_no = 8890,此时服务器端会处于LAST_WAIT的状态,
  • 客户端在收到服务端发送的第二次报文之后,会再向服务端发送一个报文,设置ACK=1的确认标志,并且设置一个ack_no=8891的值,此时客户端处于TIME_WAITING的状态,最后服务端接收到响应报文之后,服务端会处于一个CLOSED的状态

在这里插入图片描述

3.2.1,为什么需要time-wait

在上图中可知,在客户端第二次向服务端发送报文的时候,会有一个TIME-WAIT的时间设置,规定需要等待2MSL,一般的操作系统都是设置成2分钟,当然会有部分的操作系统设置的值不一样,如在linux操作系统设置的值为1分钟,那么接下来需要了解,为什么这段第四次挥手需要等待两分钟

  • 首先还是为了保证系统的可靠性,如服务端第二次给客户端报文时设置的seq是2000,FIN=4,此时是有4个包,但是客户端接收到的seq的值为2002,正常是2004,少了两个包,此时就需要服务端重传
  • 第二个原因是如果不设置那么长时间,往服务端发送完数据之后直接closed,那么就会出现一个问题,如果此时服务端发现客户端seq的值少了两个,需要服务端这边重传,然后客户端这边已经关闭连接,如果此时是还是刚刚关闭的客户端发起的一个新的程序,并且此时的客户端的操作系统又给这个新的应用程序分配的就是上一个端口号,那么此时新的应用程序就会拿到一个上一个服务端第三次挥手重传的数据,此时新的应用程序就会处于一个懵圈状态,此时就会出现一个报文混乱的状态。为了保证tcp传输的可靠性,因此需要在这里做一个时间等待

确认一个连接就是源ip,源端口号,目标ip,目标端口号,上面第二点的第三次握手的报文还是发送在同一个ip的同一个端口号,因此还是同一个连接,那么新的应用程序就会接收到上一个关闭程序的报文

3.2.2,time-wait举例

上面讲了为什么需要time-wait,这里举一个在实际开发中,可能出现time-wait的案例。

以mysql为例,假设在实际开发中,用完mysql之后没有主动的去closed,如果客户端长时间的没有向服务端发送数据报文,发么mysql服务端可能就会认为该客户端已经下线,那么服务端就发起断开连接的操作,此时由服务端发起第一次挥手,服务端第四次挥手响应客户端之后,会有一个TIME_WAIT的等待时间,假设该操作系统的time-wait是2分钟,那么需要再2分钟之后,服务端才会closed,才能真正的去释放一个连接

如果每次用完mysql都不主动的去closed,那么每次都会由服务端去发起断开连接的请求,就会产生大量的time-wait,服务器会随着客户端的不断增加,在某一个时间点会出现资源耗尽的情况,如果是一台繁忙的服务器,那么就很有可能因为这个time-wait出现宕机的情况。

在这里插入图片描述

因此在实际开发中,如果是手动的通过JDBC驱动实现mysql的连接,那么一定要记得手动的close,让客户端去发起断开连接的请求,让time-wait这个时间结点出现在客户端这边,减少服务端这边的资源损耗。

4,UDP协议

udp和tcp都是处于传输层,但是udp和tcp底层实现不一样,udp属于不可靠连接,面向的是无连接的协议,就是说客户端发送数据之后,不需要去关心服务端是否收到数据,udp的特性如下

  • 因为udp在一端发送数据之后不需要关心另一端是否收到数据,因此udp会出现丢包的情况

  • 也因为不需要对端接收数据的确认,因此udp的速度快于tcp

  • udp双端属于点对点连接,因此可以通过udp实现udp单播

  • udp也可以不设置另一端的端口号,那么可以通过udp实现广播,可以让多个端口号接收到数据

  • 由于允许丢包这种,那么视频音频这些都可以通过udp的方式实现通信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1477316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代理IP安全问题:在国外使用代理IP是否安全

目录 前言 一、国外使用代理IP的安全风险 1. 数据泄露 2. 恶意软件 3. 网络攻击 4. 法律风险 二、保护国外使用代理IP的安全方法 1. 选择可信的代理服务器 2. 使用加密协议 3. 定期更新系统和软件 4. 注意网络安全意识 三、案例分析 总结 前言 在互联网时代&…

xilinix 的硬件资源分布

从官方手册UG475中可以看出,下图中的V690T系列的i芯片,其具有的bank数量,已经上下半区的bufg对应的bank关系,实际在开发过程中,可能面临局部资源集中度过高,导致bufg的数量不够的情况,bufg的位置…

Docker数据集与自定义镜像:构建高效容器的关键要素

目录 博客前言 一.数据卷 1.数据卷介绍 2.实战 宿主机和容器共享目录 容器和容器之间共享目录 二.自定义镜像 1.自定义镜像介绍 2.实战 2.1自定义centos,具备vim及ifconfig作用 构建镜像 通过镜像运行一个容器进行测试 2.2自定义tomact(文件为…

人工智能_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0105

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来

Python3中真真假假True、False、None等含义详解

在Python中,不仅仅和类C一样的真假类似,比如1代表真,0代表假。Python中的真假有着更加广阔的含义范围,Python会把所有的空数据结构视为假,比如 [] (空列表)、 {} (空集合)、 (空字符…

初探2b blender

总结 按照youtube 教程 做了个雏形 心得 从正面, 侧面 视图整体上调整外轮廓流线型趋向, 比如正面看这个发型像个鸡蛋的外轮廓头发重要的是丝滑, 流畅 集束 层次 交错

Flutter开发进阶之Flutter Web加载速度优化

Flutter开发进阶之Flutter Web加载速度优化 通常使用Flutter开发的web加载速度会比较慢,原因是Flutter web需要加载的资源处于国外,以下是据此所做的相应优化。 一、FlutterWeb打包 flutter build web --web-renderer canvaskit使用新命令打包 flut…

面试经典150题——插入区间

"The future belongs to those who believe in the beauty of their dreams." - Eleanor Roosevelt 1. 题目描述 2. 题目分析与解析 2.1 思路一 解决这个问题的思路是基于区间排序和合并的经典算法。这个问题的关键在于如何处理新区间与现有区间的关系&#xff0c…

【C++入门】C++关键字 | 命名空间 | C++的输入输出

目录 0.C与C 1.C的关键字 2.命名空间 2.1域 2.2C中命名冲突问题 2.3命名空间定义 2.4命名空间使用 2.5命令空间的展开&头文件的展开 3.C的输入&输出 3.1cout&cin 3.1<<流插入运算符 3.2>>流提取运算符 0.C与C C是在C的基础之上&#xff…

九州金榜|家庭教育中孩子厌学的原因有哪些?

孩子的成长往往会受到家庭教育&#xff0c;社会环境&#xff0c;学校教育等因素影响&#xff0c;孩子厌学受家庭教育影响是一个重要因素&#xff0c;都是哪些因素会让孩子产生厌学情绪呢&#xff1f;下面九州金榜家庭教育分析一下因为家庭教育因素而让孩子产生厌学的原因&#…

Redis学习------实战篇----2024/02/28

1.集群的session共享问题 2.基于Redis实现共享session登录 //4.保存验证码到redisstringRedisTemplate.opsForValue().set(LOGIN_CODE_KEYphone,code,LOGIN_CODE_TTL, TimeUnit.MINUTES);RedisTemplate RedisTemplate使用的是JdkSerializationRedisSerializer存入数据&#xff…

不看后悔的2024年腾讯云服务器购买优惠活动汇总

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

二叉树(C/C++)

本篇将较为详细的介绍二叉树的相关知识&#xff0c;以及二叉树的实现。对于二叉树的相关知识&#xff0c;本篇介绍了其概念、特殊的二叉树、性质还有存储结构。 接着对于实现二叉树的每个函数都有其思路讲解&#xff0c;主要的函数分为&#xff1a;遍历&#xff1a;前中后序遍历…

redis-Redis主从,哨兵和集群模式

一&#xff0c;Redis的主从复制 ​ 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。这样做的好处是读写分离&#xff0c;性能扩展&#xff0c;容灾快速恢复。 1.1 环境搭建 如果你的redi…

【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题

一、背景 近期操作退役EC集群的节点。在退役的过程中,遇到了一些问题。特此总结一下。 本文描述的问题现象是: 每一批次退役10个节点,完全退役成功后开始操作下一批。 但是,中间有一批次有2台节点的Under Replicated Blocks一直是1,不往下降。 处于Decommissioning状态卡…

iOS App冷启动优化:Before Main阶段

iOS应用冷启动时&#xff0c;在 UIApplicationMain(argc, argv, nil, appDelegateClassName)方法执行前&#xff0c;主要经历以下阶段&#xff1a; 1. 执行exec&#xff08;&#xff09;启动应用程序进程 2. 加载可执行文件&#xff0c;即将应用程序的Mach-O文件加载到内存…

跟着野火学FreeRTOS:第二段(堆存储管理)

F r e e R T O S FreeRTOS FreeRTOS从版本 V 9.0.0 V9.0.0 V9.0.0开始&#xff0c;内核对象所用的存储空间可以在编译时静态分配或在运行时动态分配&#xff0c;早期的版本不同时支持静态分配和动态分配&#xff0c;这里讲到的堆存储管理是和动态分配相关的。从版本 V 9.0.0 V9…

跨区域复制建筑UI输入框脚本迷你世界

--复制区域文件 --设置坐标起点&#xff0c;终点 --创建区域 --获取坐标id,data --星空露珠工作室制作 local pos1{x-16,y7,z28} local pos2{x28,y44,z-9} local block{num0} local str{} local str0{} local num0 local count0 local ui6 --几个输入框 local romath.random(…

【LeetCode:108. 将有序数组转换为二叉搜索树 + 二叉树+递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Vue3+springboot实现简单登录demo

Vue3从0搭建脚手架步骤【默认已安装node.js】 前置条件&#xff1a;默认已安装node.js、yarn 第一步&#xff1a;创建项目 选择任意一个空白文件夹如下&#xff1a; cmd进入该文件夹下的命令窗口模式&#xff0c;然后输入指令创建vue项目&#xff1a;vue create my-project …