深入理解网络通信基本原理和tcp/ip协议
深入理解网络通信基本原理和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的方式实现通信
相关文章:

深入理解网络通信基本原理和tcp/ip协议
深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1,计算机网络体系结构2,网络中数据传输2.1,浏览器中输入一个url的执行流程2.2,数据在网络中是的传输流程 3,三次握手和四次挥手3.1,三次握手3.1.1…...

Jetson系统烧录环境搭建
一 序言 Jetson 系列产品烧录系统的方法一般有两种,一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统(请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》)。另一种即为当前文档所描述的,在安装 Ubun…...

【MySQL】:约束全解析
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…...

设计一基于Text generation web UI的语言模型部署与远程访问的方案
前言 Text generation web UI可为类ChatGPT的大型语言模型提供能够快速上手的网页界面,不仅可以提高使用效率,还可满足私有化部署,或对模型进行自定义。目前,该Web UI已经支持了许多流行的语言模型,包括LLaMA、llama.…...
大数据概述
学习大数据有什么用? 2010年:大数据技术体系开始在国内火热 2015年:国务院印发《促进大数据发展行动纲要》 2016年:发改委发布关于组织实施促进大数据发展重大工程的通知 2017年:工信部印发大数据产业规划(2016-20…...

Muduo库编译学习(1)
1.muduo库简介 muduo是由Google大佬陈硕开发,是一个基于非阻塞IO和事件驱动的现代C网络库,原生支持one loop per thread这种IO模型,该库只支持Linux系统,网上大佬对其褒贬不一,作为小白用来学习就无可厚非了。 git仓库…...

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug
文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…...

ZYNQ--MIG核配置
文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…...

MySQL 多表查询 连接查询 内连接
介绍 内连接查询是两张表中交集的部分 连接模式 隐式内连接 SELECT 字段列表 FROM 表1,表2 WHERE 条件显式内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件案例 有两张表一个表为学生表,另一个表为班级表,现在需要查询学生时候在查…...

T - SQL使用事务 及 在Winform使用事务
事务适用场景 1 事务使用在存储过程中,直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl:使用事务转账操作的实例 一般都会找一个变量记录错误的个数,error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…...
string(三)--实现
大家看了这么久的string了,可能对string的简单实现有兴趣,所以我实现了一个string类的常用接口,大家可以自行查看: 我是分多文件写的: string.h: #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <ios…...

textbox跨线程写入
实现实例1 实现效果 跨线程实现 // 委托,用于定义在UI线程上执行的方法签名 //public delegate void SetTextCallback(string text);public void textBoxText(string text){// 检查调用线程是否是创建控件的线程 if (textBox1.InvokeRequired){// 如果不是&#…...

幻兽帕鲁专用服务器搭建之Linux部署配置教程
大家好我是飞飞,上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求,很多小伙伴就寻思用Linux系统搭建占用会不会小一点?有计算机基础的小伙伴都知道Linux系统和Windows系统相比,…...

Kubernetes: 本地部署dashboard
本篇文章主要是介绍如何在本地部署kubernetes dashboard, 部署环境是mac m2 下载dashboard.yaml 官网release地址: kubernetes/dashboard/releases 本篇文章下载的是kubernetes-dashboard-v2.7.0的版本,通过wget命令下载到本地: wget https://raw.githubusercont…...

Outlook邮箱IMAP密码怎么填写?账户设置?
Outlook邮箱IMAP密码是什么?Outlook如何设置IMAP? 许多用户会选择通过IMAP协议将邮箱与各种邮件客户端进行连接。而在设置过程中,填写IMAP密码是必不可少的一步。那么,Outlook邮箱的IMAP密码应该如何填写呢?接下来&am…...

[计算机网络]--I/O多路转接之poll和epoll
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、poll函…...

【NTN 卫星通信】卫星和无人机配合的应用场景
1 场景概述 卫星接入网是一种有潜力的技术,可以为地面覆盖差地区的用户提供无处不在的网络服务。然而,卫星覆盖范围对于位于考古或采矿地点内部/被茂密森林覆盖的村庄/山谷/靠近山丘或大型建筑物的用户可能很稀疏。因此,涉及卫星接入和无人驾…...
Git 分布式版本控制系统
Git是一个分布式版本控制系统,可以记录项目文件的变动并管理项目的不同版本。以下是Git的基本概念和使用方式: 仓库(Repository):Git用仓库来存储项目文件。仓库可以是本地仓库,也可以是远程仓库࿰…...
ng : 无法将ng项识别为 cmdlet、函数、脚本文件或可运行程序的名称
ng : 无法将“ng”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,出现这种错误,那说明你angular-cli没有下载所以环境变量里没有相应的东西 1、需要在cmd里输入npm install -g angular/cli 2、之后运行angular命令时还可能出现这种错误 “ng : …...
iOS小技能:苹果书签打包教程【WebClip描述文件(WebClip Configuration Profile)】
文章目录 引言I WebClip描述文件1.1 属性说明1.2 利用Apple Configurator 2生成描述文件II 部署方式和签名2.1 对 .mobileconfig 文件进行签名2.2 部署方式引言 WebClip描述文件(WebClip Configuration Profile)是一种用于iOS设备的简易配置文件,它可以在你的iOS设备(如iP…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...