Netty基础—3.基础网络协议一

news2025/3/13 17:33:00

大纲

1.网络基础的相关问题总结

2.七层模型和四层模型

3.物理层(网线 + 光缆 + 01电信号)

4.数据链路层(以太网协议 + 网卡mac地址)

5.网络层(IP协议 + 子网划分 + 路由器)

6.传输层(TCP和UDP协议 + Socket + 端口)

7.应用层(HTTP协议 + SMTP协议)

8.浏览器请求一个域名会发生什么

9.TCP三次握手建立连接的过程

10.如果TCP建立连接只握手两次

11.TCP断开连接的四次挥手

12.Socket编程和TCP/IP协议的关系

13.HTTP的工作原理

14.HTTPS的实现原理

15.全双工和半双工

16.Java进行IO读写的底层流程

17.同步和异步 + 阻塞和非阻塞

18.Linux的常用IO模型

19.IO多路复用技术

20.select、poll、epoll的区别

1.网络基础的相关问题总结

首先是七层模型和四层模型,然后是一次请求的全过程,接着是传输层的TCP连接(三次握手和四次挥手),然后就是传输层TCP协议上的Socket编程,最后是应用层的HTTP协议。

2.七层模型和四层模型

TCP/IP四层模型(应传网数):应用层、传输层、网络层、数据链路层。其中每一层对应的协议分别是:数据链路层(以太网协议),网络层(IP协议),传输层(TCP协议),应用层(HTTP协议)。

OSI七层模型(应表会传网数物):应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。注意:物理层(网线和光缆传递01电信号),会话层、表示层、应用层 -> 应用层。

电脑的网络设置中一般会包含IP地址、子网掩码、网关地址、DNS地址。IP地址和子网掩码用来划分子网,判断哪些IP地址在一个子网内。IP地址和mac地址是关联起来的,可以唯一定位网卡。网关地址可以认为是路由器上的那个网卡的IP地址,路由器上的网卡也有mac地址,mac地址对应了一个IP地址。

3.物理层(网线 + 光缆 + 01电信号)

物理层指的是通过网线或光缆把各个电脑连接起来形成一个网络。物理层负责传输0和1的电信号,计算机的最底层就是0和1的电信号,所以物理层通过传输0和1的电信号把各个电脑连接起来。

4.数据链路层(以太网协议 + 网卡mac地址)

数据链路层负责处理0和1的电信号如何分组,比如在一连串的电信号中区分哪些0和1分为一组、对应什么意思。一组电信号是一个数据包,也叫一个帧(frame)。每个帧分成两个部分,标头(head)和数据(data)。标头是一些说明性的数据,比如发送者、接收者和数据类型等。

//比如定义:
00000011(从电脑1出发,要到电脑2去)
00101(从电脑1出发,要到电脑3去)
0101(从电脑2触发,要到电脑4去)
01(从电脑3出发,要到电脑5去)

以太网协议规定了电信号的分组方式,在其协议下发送的数据包必须指定目标电脑网卡的mac地址。以太网协议规定了接入网络的所有设备都要有个网卡,每个网卡必须包含一个mac地址,mac地址就是网卡的唯一标识。所以以太网协议里的数据包,或者说在数据链路层传输的数据包,必须从一台电脑的网卡传输到另外一台电脑的网卡。

在以太网里面,如果一台电脑发送一个数据包出去,会广播给局域网(子网)内的所有电脑的网卡,然后每台电脑都从数据包里获取接收者的mac地址,跟自己的mac地址进行对比,如果一样就说明这是发给自己的数据包。

5.网络层(IP协议 + 子网划分 + 路由器)

(1)IP协议区分电脑属于哪个子网

(2)两个IP地址是否属于一个子网

(3)两台电脑如何传输数据包

(4)路由器的作用

(5)交换机和路由器的对比

(6)两个局域网如何通过路由器通信

(7)总结

(1)IP协议区分电脑属于哪个子网

子网(局域网)内的电脑在以太网协议下,是通过广播方式将一个数据包发送给另一台电脑的。

但是如何知道哪些电脑是在同一个子网内的呢?网络层里有IP协议,通过IP协议就可以区分哪些电脑是一个子网的。

(2)两个IP地址是否属于一个子网

每台计算机都会分配一个IP地址,如IPV4版本的IP地址由32个二进制数字组成。其中前24位代表了网络,后8位代表了主机。

如果要判断两个IP地址是否是一个子网的,则要分别把两个IP地址和自己的子网掩码进行二进制的位与运算,位与运算后再比较一下代表网络的那部分,如果网络的那部分是一样的才是一个子网。

(3)两台电脑如何传输数据包

两台在子网内的电脑可以通过广播 + mac地址的判断来发传输据包,两台不在子网内的电脑则不能通过广播而需要通过路由器来传输数据包。

(4)路由器的作用

路由器负责将多个子网(局域网)进行连接。家里的网络是一个子网,要访问的网站是另一个子网。

路由器其实就是配置了多个网卡的一个专用设备,可以通过不同的网卡接入不同的子网。

路由器上的每个网卡都有mac地址和对应的IP地址。路由器虽然有mac地址,但是不能通过mac地址寻址。必须通过IP地址寻址,所以路由器是工作在网络层的设备。

(5)交换机和路由器的对比

交换机主要用在局域网(子网)的通信,局域网里的电脑就是通过交换机把数据包广播到局域网内的其他电脑上。

交换机是通过mac地址来寻址和传输数据包的,基于以太网协议工作在数据链路层。路由器是通过IP地址来寻址和传输数据包的,基于IP协议工作在网络层。网关也是路由器的一种,工作在网络层。

LAN就是Local Area Network(局域网),WAN就是Wide Area Network(广域网),WLAN就是Wireless Local Area Network(无线局域网WIFI)。

(6)两个局域网如何通过路由器通信

步骤一:首先路由器1配置了两块网卡分别和两个局域网相连。

步骤二:然后子网1的电脑先通过交换机将数据包发送给路由器1。该过程要将路由器1的一块网卡的IP地址所对应的mac地址写到数据包头部,然后才能通过交换机将数据包广播出去到路由器1。

步骤三:接着路由器1通过IP地址寻址后把数据包传输到路由器2。

步骤四:当路由器2接收到数据包后会比较自己网卡里的mac地址确认是否给自己,然后会在子网2内将目标机器的IP地址对应的mac地址写入数据包头部,接着再次通过交换机广播给子网2的目标电脑。

一个局域网内的每台机器都有自己的ARP缓存,ARP的作用是用来在一个局域网内让各个设备知道彼此的IP地址和mac地址的。

一个IP地址对应着一个mac地址。如果子网内的机器需要进行通信,只需在数据包写上对方的mac地址,再通过交换机广播到对方的机器上即可。如果跨子网的机器需要进行通信,就要在数据包写上对方的IP地址,然后先通过mac地址广播到路由器,接着路由器再把数据包传输到路由器,最后让路由器再根据另外一个子网的IP地址转换为mac地址,然后通过另外一个子网的交换机广播到对方的机器上。

(7)总结

网络层最重要的协议就是IP协议,IP协议定义了一个个的IP地址,通过IP地址可以划分出一个个的子网。

子网内通信是通过以太网协议 + mac地址 + 交换机来广播数据包的。

跨子网通信是先通过交换机将数据包广播到路由器(网关)上去,路由器(网关)可能会再进行不断转发到另一个路由器(网关),直至转发到最后一个路由器发现目标机器的IP地址和自己是在同一个子网内,最后一个路由器根据ARP缓存可以知道目标机器的IP地址和对应子网的mac地址。所以由最后一个路由器通过以太网协议 + mac地址 + 交换机,把数据包广播到目标机器的网卡上。

跨子网通信:IP地址 -> mac地址 -> 交换机 -> 路由器 -> IP地址 -> 交换机。

6.传输层(TCP和UDP协议 + Socket + 端口)

网络层基于IP协议,可实现一个主机到另一个主机的寻址和通信。

传输层基于TCP/UDP协议,可实现一个主机端口到另一个主机端口的连接和通信,这个通信就是通过Socket来实现的。

通过Socket可以基于TCP/IP协议完成基于IP地址和mac地址的转换和寻址,然后通过路由器通信建立一个端口到另外一个端口的连接。

UDP和TCP都是传输层的协议,作用就是在数据包里加入端口号,这样就可以通过端口号进行点对点的通信。UDP协议是不可靠的,发出去的数据不确定是否能收到。TCP协议是可靠的,要进行三次握手,收到数据必须要进行回复。

7.应用层(HTTP协议 + SMTP协议)

通过传输层的TCP协议可以实现应用间的数据传输,而不同的应用如邮件、网页等都会定义不同的应用层协议。常见的应用层协议有HTTP协议、SMTP协议等,这里的应用层综合了会话层、表示层、应用层。

8.浏览器请求一个域名会发生什么

整体过程:

首先根据域名去找DNS服务器获取其对应的IP地址,接着用子网掩码去判断本地IP地址和域名IP地址是否在同一个子网。如果在同一个子网,则根据以太网协议 + mac地址 + 交换机将数据包广播出去。如果不在同一个子网,则先将数据包发送给网关(路由器),再由网关转发数据包给域名IP所在子网的网关。

应传网数:

应用层(HTTP协议)-> 传输层(TCP协议) -> 网络层(IP协议) -> 数据链路层(以太网协议)。

步骤一:

浏览器请求一个域名,先按照应用层的HTTP协议,将HTTP请求报文封装成一个HTTP数据包,此时的HTTP数据包是没有头的。

步骤二:

接着HTTP数据包来到传输层,该层的TCP协议会HTTP给数据包设置端口。也就是会把HTTP数据包封装到一个TCP数据包上,并且添加一个TCP头,这个TCP头会包含发送者和接收者的端口。

步骤三:

接着TCP数据包来到网络层,该层的IP协议会给TCP数据包设置IP地址。也就是会把TCP头和TCP数据包封装到一个IP数据包里,并且添加一个IP头,这个IP头里会包含发送者和接收者的IP地址。通过IP协议,可以判断发送者和接收者的IP地址是否是在同一个子网的。

步骤四:

接着IP数据包来到数据链路层,该层的以太网协议会给IP数据包设置mac地址。也就是把IP头和IP数据包封装到一个以太网数据包里,并且添加一个以太网头。这个以太网头里会包含发送者和接收者的网卡的mac地址,以太网数据包的大小限制是1500字节。

步骤五:

以太网数据包会通过交换机被发送到网关(路由器),网关(路由器)又会将数据包发送给别的子网,最后到达服务器接收者。

9.TCP三次握手建立连接的过程

在Socket编程中,三次握手的过程会由客户端执行connect()方法来触发。

第一次握手:

客户端发送连接请求报文:ACK = 0、SYN = 1、seq = x。当客户端发出连接请求报文后,会处于SYN_SENT状态,等待服务器的响应。

第二次握手:

服务端收到SYN = 1的连接请求报文后,需要返回一个确认报文:ACK = 1、SYN=1、ack = x + 1、seq = y。当服务端发出确认报文后,会处于SYN_RECV状态。

第三次握手:

客户端收到ack = x + 1的确认报文后,会继续发送一个确认报文:ACK = 1、ack = y + 1、seq = x + 1。当服务端收到ack = y + 1的报文后,则说明连接建立成功,此时客户端和服务端都进入ESTABLISHED状态。

三次握手就是三次请求,所以每次握手都会进行:封装TCP数据包、封装IP数据包、封装以太网数据包,然后通过"IP地址 -> mac地址 -> 交换机 -> 路由器 -> IP地址 -> mac地址 -> 交换机"的方式进行数据传输。

图片

10.如果TCP建立连接只握手两次

一.假如只需要两次握手就可以建立连接

如果客户端第一次握手发送过去,结果卡在某个地方没及时到达服务端。那么客户端会再次重试发送第一次握手过去,然后服务端收到了重发的第一次握手,于是返回第二次握手建立了连接。

当客户端和服务端完成通信后,原来卡在某个地方的第一次握手发到了服务端,于是服务端又返回一个第二次握手,并且开辟资源准备和客户端进行通信。

但是客户端此时已经通信完成了,不会再发送数据给服务端,从而造成服务端无效地开辟资源。

二.假如需要三次握手才可以建立连接

此时面对上述情况,客户端收到服务端延迟的第二次握手时就会发现不对,于是就可借助第三次握手发送复位报文告诉服务端撤销开辟的资源。此外由于3次握手就够了,所以不需要4次或5次浪费资源了。

11.TCP断开连接的四次挥手

第一次挥手:

客户端发送连接释放报文:FIN=1、seq=u,然后进入FIN-WAIT-1状态。

第二次挥手:

服务端收到报文后进入CLOSE_WATI状态,然后返回客户端一个确认报文:ACK=1、ack=u+1、seq=v。客户端收到确认报文后进入FIN-WAIT-2状态,此时从客户端到服务端的连接就释放了。

第三次挥手:

服务端发送连接释放报文:FIN=1、ack=u+1、seq=w,然后进入LAST-ACK状态。其中序列号seq是w而不是v+1,是因为服务端很可能又发送了一些数据。

第四次挥手:

客户端收到连接释放报文后,发送应答报文:ACK=1、ack=w+1、seq=u+1。然后进入TIME_WAIT状态,再等一会便会进入CLOSED状态,服务端收到应答报文后也会进入CLOSED状态。

图片

由于TCP连接是全双工的,因此每个方向都必须要单独进行关闭。当一方完成数据发送任务后,需要发送一个FIN来终止这一方向的连接。收到一个FIN只是意味着这一方向上没有数据流动了也就是不会再收到数据,但在这个TCP连接上仍然可能会发送数据除非也发送一个FIN回去。

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

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

相关文章

【mysql】centOS7安装mysql详细操作步骤!

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式 需要 root 权限,使用 root 用户进行命令操作。 1. 查看 CentOS 版本 cat /etc/redhat-release2. 安装rpm包,以8为例 打开 MySQL 官方 yum 仓库网站,获取与当前 CentOS …

使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库

定义 检索增强生成(RAG)的基本定义 检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息,并将其作为提示&…

笔试刷题专题(一)

文章目录 最小花费爬楼梯(动态规划)题解代码 数组中两个字符串的最小距离(贪心(dp))题解代码 点击消除题解代码 最小花费爬楼梯(动态规划) 题目链接 题解 1. 状态表示&#xff1…

LeetCode977有序数组的平方

思路①:先平方,后快排,输出(基准元素,左小右大) 时间复杂度:O(nlogn) 思路②:双指针左右开弓,首先原数组已经是按照非递减顺序排序,那…

网络变压器的主要电性参数与测试方法(4)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…

Windows10 WSL又又又一次崩了 Docker Desktop - Unexpected WSL error

问题:Windows10 WSL又又又一次崩了 这回报错: 然后再打开WSL Ubuntu就卡住了,等很长时间没反应,就关掉了。 手动启动Docker Desktop,报错: An unexpected error occurred while executing a WSL comman…

【前端基础】:HTML

超链接标签: a href: 必须具备, 表示点击后会跳转到哪个页面. target: 打开方式. 默认是 _self. 如果是 _blank 则用新的标签页打开 <a href"http://www.baidu.com">百度</a>链接的几种形式: 外部链接: href 引用其他网站的地址 <a href"http…

JVM垃圾收集器合集

前言&#xff1a;JVM GC收集器的回顾与比较 JVM&#xff08;Java虚拟机&#xff09;中的垃圾收集器是自动管理内存的重要机制&#xff0c;旨在回收不再使用的对象所占用的内存空间。以下是JVM中几种常见的垃圾收集器的详细介绍&#xff1a; 一、新生代垃圾收集器 1.Serial收集…

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制&#xff1f; 1.1 为什么要会略&#xff1f; 对于开发者而言&#xff0c;明智地选择忽略某些文件类型&#xff0c;能带来三大核心优势&#xff1a; 仓库纯净性&#xff1a;避免二进制文件、编译产物等污染代码库 安全防护&#xff1a;防止敏感信息&…

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…

视频推拉流:EasyDSS平台直播通道重连转推失败原因排查与解决

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推&#xff0c;发现只要关闭…

【科研绘图系列】python绘制分组点图(grouped dot plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…

Springfox、Springdoc和Swagger

Springfox、Swagger 和 Springdoc Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成API文档的工具&#xff0c;但它们之间有显著的区别和演进关系&#xff1a; 1.Swagger 简介 Swagger 是一个开源项目&#xff0c;旨在为 RESTful APIs 提供交互式文档。最…

在Spring Boot项目中如何实现获取FTP远端目录结构

Java语言实现获取FTP远端目录结构的实现方式有多种,在Spring Boot 项目中,最简单和快速的方式就是使用Spring Integration 实现FTP相关的功能。 前言 本篇的示例和演示基于Windows 的FTP 服务,关于如何在Windows 开启FTP服务可以参考: Windows 如何开启和使用FTP服务 本…

Flutter_学习记录_device_info_plus 插件获取设备信息

引入三方库device_info_plus导入头文件 import package:device_info_plus/device_info_plus.dart;获取设备信息的主要代码 DeviceInfoPlugin deviceInfoPlugin DeviceInfoPlugin(); BaseDeviceInfo deviceInfo await deviceInfoPlugin.deviceInfo;完整案例 import package…

Java高频面试之集合-10

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详解红黑树&#xff1f;HashMap为什么不用二叉树/平衡树呢&#xff1f; 一、红黑树&#xff08;Red-Black Tree&#xff…

never_give_up

一个很有意思的题&#xff1a; never_give_up - Bugku CTF平台 注意到注释里面有1p.html&#xff0c;我们直接在源代码界面看&#xff0c;这样就不会跳转到它那个链接的&#xff1a; 然后解码可得&#xff1a; ";if(!$_GET[id]) {header(Location: hello.php?id1);exi…

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…

AI4CODE】3 Trae 锤一个贪吃蛇的小游戏

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 这次还是采用 HTML/CSS/JAVASCRIPT 技术栈 Trae 锤一个贪吃蛇的小游戏。 1 环境准备 创建一个 Snake 的子文件夹&#xff0c;清除以前的会话记录。 2 开始构建 2.1 输入会…

Linux 进程的一生(一):进程与线程的创建机制解析

在 Linux 操作系统中&#xff0c;每个任务都以「进程」的形式存在。但 Linux 下的「线程」又是什么&#xff1f;Linux 并没有单独定义一种全新数据结构来表示线程&#xff0c;而是将线程视为一种特殊的进程——一种共享资源的轻量级进程。然而&#xff0c;在具体实现和运行机制…