Linux网络 | 理解NATPT, 数据链路层Done

        前言:本节内容结束数据链路层, 本节的重要内容有两个:一个是见一个综合性面试题,另一个就是NAT技术NATPT。 那么废话不多说, 开始我们的学习吧!!!

        ps:最好先看一下上一篇再看本节哦:Linux网络 | 进入数据链路层,学习相关协议与概念-CSDN博客

DNS

        域名析服务,实际上我们在访问一个网站的时候,我们真正要访问服务器的是拿着IP地址访问的,但是IP地址不容易记,为了让互联网更容易使用,就有了一套域名解析服务,这套服务就叫的DNS。

域名

        这里以www.baidu.com为例:

  •         .com:一级域名,表示一个企业域名,同级的还有“net”(网络提供商),“org”(非盈利组织)等。
  •         baidu:二级域名 一般都叫做公司名。
  •         www:习惯用法。可以不写。

        这里关于域名有一道面试题:当我输完域名之后,一按回车,就拿到网页的整个过程?

        这道题可以分为三步谈:

  • http的过程 +域名解析
  • https谈一下
  • 谈论细节  

        下面是博主大概说的框架: 

  •         经过域名解析,拿到目标服务器的IP地址,然后浏览器就拿着目标主机的IP地址去进行三次握手。然后进行密钥协商。这些完成之后就可以进行通信,构建http请求,构建http请求的时候就构建它的请求报头,状态行,空行和数据。                                                然后我们的目标主机拿到请求之后,就对客户端进行应答。构建响应报文,构建响应报头,响应状态行,空行,报文。然后根据http的连接将响应报文发给客户端。浏览器得到之后就对得到的报文进行解析,解析之后提取他的正文,对他的正文进行解释,进行渲染工作,就能看到我们看到的网页了。
  •         其实在三次握手完成之后,数据通信之前,双方还要进行密钥协商。 这里就用到了我们之前学到的证书的内容。
  •         谈完应用层, 然后进入传输层。http底层其实都是字节流,我们的请求都是要拷贝到发送缓冲区,由http进行传输控制。http的传输控制策略有很多,什么连接管理,流量控制,拥控制,确认应答,32位字号,超时重传等等。
  •         然后就到了IP层,tcp其实只是来控制传输数据时的可靠和效率。但是真正进行传输数据,进行办事的还是IP层,也就是网络层。在IP层,有子网划分,查路由表,IP分片和组装等等技术确保能够正确的由原主机发送到目标主机。
  •         然后为什么有IP分片和组装就到了数据链路层的Mac帧的内容,Mac有MTU和MSS两个技术倒逼上层的一次发送的报文不能太大。 

ICMP 

        先谈ICMP的作用, 有如下四个性质:

  • 确认IP包是否成功到达目标地址。
  • 通知在发送过程中IP包被丢弃的原因。
  • ICMP也是基于IP协议工作的.但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
  • ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要是用ICMPv6。

        我们细谈ICMP的作用, ICMP有什么用呢?上面的第二条性质是什么意思。假如我们平时使用不适用ICMP协议,那么我们主机A向主机B发送信息,如果发送不过去,那么这个报文就被丢弃了,一段时间后主机A就会超时重传。

        但是如果有ICMP报头封装一层。 那么就会由路由器1返回给主机A一条信息,告诉我们信息不可达。

        就是说IP上面一层报头封装的不是tcp和udp、是ICMP。事实上,其实是有一种原始套接字系统调用的。这个系统调用就能够直接越过tcp、udp,直接封装ICMP报头。以后每台主机在网络层都能查看到ICMP。你给我的是ICMP、返回的也带有ICMP。 

        最后, 也有一个关于ICMP面试题:telnet是23端口ssh是22端口。那么ping是什么端口?

        其实ping命令是基于ICMP,工作在网络层的。而端口号是传输层的内容。在ICMP中根本不关注端口号这样的信息。 

重谈NAT技术 

        在我们之前在IP层讲解NAT技术的时候遗留了一个问题,就是由服务器公网向私网中响应, 如何响应呢?

        首先我们先回忆一下我们的NAT: 

        NAT能够将私有IP对外通信时转为WAN口IP也就是就是一种将私有IP和全局IP相互转化的技术方法。

        很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP。

        全局IP要求唯一,但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;

NATPT 

        
        其实由公网响应私网的根本问题就是在内网当中,如果多态主机都访问同一个外网服务器。那么返回的服务器数据中,其实目的IP都是路由器的WAN口IP。此时, 我们哪一条报文是给哪一台机器的, 就分不清楚了。

        所以,我们的路由器在输出的时候,在路由器内部会生成一张内网的源IP源端口,目的IP目的端口到外网的源IP源端口,目的IP目的端口的映射关系。这张表,我们称为NAT转化表。

         

        比如说今天客户端A,IP地址:10.0.0.10,端口号1025要同目标主机位:163.21.1209,端口号0,最后经过替换之后就将源P替换成了WANIP,然后就会在映射表里面添加一组映射关系。

        然后,其中,对于不管是映射的左边还是右边,如果把他们整体当成一个字串,映射左边的字符宰在内网当中是唯一的,映射右边的字特串在公网中是唯一的——这个的唯一性是由后面的端口号保证的。 

        这个唯一性如何保证,就比如主机B也发送报文,然后经过路由器转化后报文的源IP也变成了WAN口IP。 这时候,端口就不一样了,如果映射表中的上一个数据的端口号是1025,那么这个新转化的报文的源IP端口号中的端口号就一定不能是1025。必须是别的东西,比如1026。 这样就保证了唯一性。 

        综上,NAT在替换的时候,不仅仅会替换IP。也会替换端口号.这样就保证了映射表中的键值对是双向的!!即映射双方互为键值!!

        所以,当数据回来的时候,我们的数据就知道是给哪个目的IP,哪个目的端口号。去查键值对,就能锁定内网当中的目标主机了! 

NAT技术的缺陷 

        关于NAT技术的缺陷, 其实我们能感觉出来: 

  • 无法从NAT外部向内部服务器建立连接
  • 装换表的生成和销毁都需要领外开销;
  • 通信过程中一旦NAT设备(即路由器)异常,所有的tcp连接也都会断开。

NAT和代理服务器 

        路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。

        代理服务器看起来和NAT设备有一点像。客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。

        那么NAT和代理服务器的区别有哪些呢? 

  •         从应用上讲、NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻境,另外像迅游这样的加速器,也是使用代理服务器。
  •         从底层实现上讲、NAT是工作在网络层,直接对IP地址进行替换。代理服务器往往工作在应用层。
  •         从使用范围上讲、NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。

 ——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux/C高级(精讲)----shell结构语句、shell数组

shell脚本 功能性语句 test 可测试对象三种:字符串 整数 文件属性 每种测试对象都有若干测试操作符 1)字符串的测试: s1 s2 测试两个字符串的内容是否完全一样 s1 ! s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是…

DeepSeek本地部署并提供远程连接(小白教程)

文章目录 一、DeepSeek介绍二、为什么要本地部署三、本地部署教程1.安装Ollama2.下载部署DeepSeek模型3.安装Chatbox可视化工具4.非局域网远程连接 四、DeepSeek官方开放平台API对接 参考资料:DeepSeek本地搭建部署详细图文教程 - 搬主题 一、DeepSeek介绍 DeepSeek…

足球俱乐部管理系统的设计与实现

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 足…

Star300+ 开源项目Developer-RoadMap 计算机各领域学习路线图集大成者

一、开发者的“成长宝典”来了 你是否在编程的海洋中迷茫,不知该驶向何方?你是否渴望一份清晰的指南,引领你在开发者的道路上稳步前行?今天,就为大家带来一份堪称“成长宝典”的开源项目: https://github.com/kamran…

链表和 list

一、单链表的模拟实现 1.实现方式 链表的实现方式分为动态实现和静态实现两种。 动态实现是通过 new 申请结点,然后通过 delete 释放结点的形式构造链表。这种实现方式最能体 现链表的特性; 静态实现是利用两个数组配合来模拟链表。一个表示数据域&am…

C语言switch case语句详解(非常详细)

在C语言中,switch case 语句是一种多分支选择结构,用于根据变量的值执行不同的代码块。 相比于if else语句,switch case在处理多个固定值的条件判断时更加简洁和高效。本文将详细讲解switch case语句的用法、语法格式、实例代码、注意事项&a…

DeepSeek本地部署

前言 蛇年过年前,国产大模型 DeepSeek以更高的效率、更低的计算成本火爆国内外,成为现象级AI,但由于访问人数过多经常频繁出现反应迟缓甚至是宕机的情况。 但万幸的是,DeepSeek 是一个开源模型,我们可以通过本地部署…

springboot简单应用

快速开发Springboot项目实现简单的增删改查,前期需要准备:idea与postman安装 Maven,MySQL(8),JDK(21) 目录 前言 springboot 使用3.0版本,JDK使用21,MySQL使用8版本 开发环境IDEA使用2024版本 …

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…

【Linux】24.进程间通信(3)

文章目录 3.6 systemv共享内存3.6.1 共享内存函数3.6.3 一个简单的共享内存代码实现3.6.4 一个复杂的共享内存代码实现3.6.4 key和shmid的主要区别: 3.7 systemv消息队列(了解)3.8 systemv信号量(了解)进程互斥四个问题理解信号量…

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…

深入理解Java引用传递

先看一段代码&#xff1a; public static void add(String a) {a "new";System.out.println("add: " a); // 输出内容&#xff1a;add: new}public static void main(String[] args) {String a null;add(a);System.out.println("main: " a);…

langchain教程-7.Embedding/文本向量化

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version&#xff0c;查看安装的go版本 go version 配置环境变量 查看go的环境变量配置&#xff1a; go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录&#xff0c;在该目录中新建…

Ubuntu部署Deepseek-R1模型(8b)

安装ubuntu系统 本机电脑系统ubuntu-20.04 #升级软件 sudo apt-get update#安装curl sudo apt-get install curl通过以上两条指令&#xff0c;完成了curl命令的安装。 安装ollama 打开Ollama官网 选择Linux&#xff0c; 给出如上图方框所示的一条指令 curl -fsSL https:…

【ROS视频推流】使用web_video_server完成视频推流

&#x1f680; 本文简要介绍一下使用web_video_server功能包完成实时视频推流的方法。 假设有A,B两个设备&#xff0c;它们之间可以ping通。我们需要将A设备上的实时摄像头图像推流并在B设备的浏览器上显示。 &#x1f314;01准备工作 # A设备 # 下载视频推流功能包 #&#xff…

[LVGL] 在VC_MFC中移植LVGL

前言&#xff1a; 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码&#xff0c;并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库&#xff0c;提供您创建具有易于使用的图形元素、漂亮…

Java----线程池

什么是线程池呢&#xff0c;先举一个情景&#xff1a; 一个火锅店开业了&#xff0c;早上人比较少&#xff0c;大家进店后不需要预约&#xff0c;直接付款在店里的桌子上吃饭&#xff0c;慢慢的人多了&#xff0c;店里的桌子不够用了&#xff0c;没座位的人可以先预约&#xf…

安卓开发,底部导航栏

1、创建导航栏图标 使用系统自带的矢量图库文件&#xff0c;鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖&#xff0c;并点击Sync Now …

每日Attention学习22——Inverted Residual RWKV

模块出处 [arXiv 25] [link] [code] RWKV-UNet: Improving UNet with Long-Range Cooperation for Effective Medical Image Segmentation 模块名称 Inverted Residual RWKV (IR-RWKV) 模块作用 用于vision的RWKV结构 模块结构 模块代码 注&#xff1a;cpp扩展请参考作者原…