Linux学习之网络编程1(纯理论)

写在前面

刚刚更新完Linux系统编程,特别推荐大家去看的Linux系统编程,总共44个小时,老师讲的非常好,我是十天肝完的,每天大概看20集,每天还要以写blog的形式来写笔记来总结一下,虽然这十天有点累,但是这套视频值得这些时间的付出。我现在在学习Linux网络编程,学习看的视频还是Linux系统编程同一个老师讲的,从今天开始更新Linux网络编程的笔记,先立一个flag:争取十天更新完(虽然我觉得这不太可能,但起码要在今年过年前更新完)


协议

OSI七层模型

  • 物理层:OSI参考模型中的最底层,面向实际承担数据传输的物理媒介,即通信通道。简单来说就是确保原始数据课在各种物理媒介上传输。
  • 数据链路层:定义了单个链路上如何传输数据。
  • 网络层:定义了端到端数据包传输,能够标识所有结点的逻辑地址,路由实现的方式和学习方式。
  • 运输层:又叫传输层。任务是向两台主机之间的进程通信提供通用的数据传输服务,应用进程利用该服务传送应用层报文。
  • 会话层:定义了如何开始,控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续信息的一部分时可以通知应用程序,使表示层看到的数据是连续的。
  • 表示层:定义数据格式及加密。
  • 应用层:OSI体系结构的最高层。任务是通过应用进程的交互来完成特定的网络应用。

这个OSI七层模型只用了解即可,我们后面写代码不用这个七层模型,用的是TCP/IP四层协议体系结构。
可以简记为“物数网传会应表

TCP/IP四层协议体系结构

  • 应用层:面向不同网络应用引入不同的应用层协议。FTP,HTTP,NFS,SSH
  • 传输层:使源端主机和目的端主机上的对等实体可以进行对话。TCP,UDP
  • 网络层:整个协议体系结构的核心。功能是把分组发往目的网路或主机。IP,ICMP,IGMP
  • 链路层(网络接口层):实际上,TCP/IP协议体系并没有真正描述网络接口层的实现,只是要求能够提供给网络层一个访问接口,以便在网络接口上传递IP分组。以太网帧协议,APR

可以简记为“网网传应

1


网络基础概念

MAC地址

介质访问控制(Media Access Control,MAC)地址也称硬件地址,长度是48位(6字节),由十六进制的数字组成,分为前24位和后24位。前24位称为组织唯一标志符(OUI),是由IEEE的注册管理机构分配给厂家的代码,用来区分不同的厂家;后24位由厂家自己分配的代码,成为拓展标识符。
在Linux系统下可以用ifconfig命令来查看MAC地址

IP地址

IP地址是IP提供的一种统一的地址格式,它为互联网上的每一个网络和每一个主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址分为IPv4和IPv6两类,由于现在主要使用IPv4地址,故下面只介绍IPv4地址
IPv4地址是一个32位的二进制数,通常分隔为四个八位二进制数(即四字节)。IPv4地址通常用点分十进制表示成a.b.c.d,其中a,b,c,d都是0-255内的十进制整数

子网掩码

子网掩码又称为网络掩码,地址掩码。计算机处理需要IP地址外,还需要知道多少位表示主机号及多少位表示子网号。这要求子网掩码不能单独存在,要结合IP地址一起使用,将某个IP地址划分为网络地址和主机地址两部分,子网掩码只针对IPv4地址。
在Linux系统下可以用ifconfig命令来查看子网掩码

端口

端口包括物理端口和逻辑端口。物理端口是用于连接物理设备的接口,逻辑端口是逻辑上用于区分服务端口。我们这里只讲逻辑端口。
Linux操作系统会给那些有需求的进程分配IP地址和端口,每一个端口由一个正整数标识。在互联网上,各个主机根据TCP/IP发送和接收数据包,数据包根据其目的主机IP地址选择路由器被传送到目的主机,当目的主机接收到数据包后,根据数据包中的目的端口号把数据发送到目的端口进行处理。
端口主要分为以下几类:

  • 周知端口:众所周知的端口号,范围是从0到2023。例如,其中80端口号分配给www服务,21端口分配给FTP服务等等。
  • 注册端口:分配给用户进程或应用程序,范围是从1024到49151.
  • 动态端口:范围是从49152到65535.之所以被称为动态端口,是因为它不固定分配某种服务端口号,而是动态分配服务端口号。

TCP

三次握手

1
2

建立TCP连接的过程又称为三次握手。建立一个TCP连接时,需要发送端和接收端共发送三个数据报文以确立连接建立。

  • 第一次握手,发送端将标志位SYN置为1,发送端进入SYN_SENT状态,随机产生一个值seq=J将该数据发送给接收端,等待接收端确认。
  • 第二次握手,接收端进入SYN_RCVD状态,收到数据后由标志位SYN=1确认发送端请求建立连接,接收端将SYNACK都置为1,ack=J+1,并随机产生一个值seq=K,并将该数据发送给发送端以确认收到请求连接。
  • 第三次握手,发送端收到请求后,检查ack是否为J+1,ACK是否为1,如果正确,将ACK置为1,ack=K+1,并将数据发送给接收端,接收端检查ack是否是K+1,ACK是否为1,如果正确则连接建立成功,接收端和发送端进入ESTABLISHED状态,完成三次握手,随后开始传输数据。

四次挥手

  • 第一次挥手,发送端发送一个FIN包,用来关闭到接收端的数据传送,发送端进入FIN_WAIT_1状态。
  • 第二次挥手,接收端收到FIN包,发送ACK给发送端,接收端进入到CLOSE_WAIT状态。
  • 第三次挥手,接收端发送一个FIN包,用来关闭到发送端的数据传送,接收端进入LAST_ACK状态。
  • 第四次挥手,发送端收到FIN包后,进入TIME_WAIT状态,并发送一个ACK确认包给接收端,经过2MSL后,进入CLOSE状态,完成四次挥手。连接完全断开。

3
4

这一篇全是理论,看起来应该有些枯燥,如果实在看不下去,可以先跳过,先看后套接字部分,等看了套接字之后再来看这可能会就会好一些。


写在最后

个人亲身经验:我们学习的一系列Linux命令,一定要自己亲手去敲。不要只是看别人敲代码,不要只是停留在眼睛看,脑袋以为自己懂了,等你实际上手去敲会发现许许多多的这样那样的问题。毕竟“实践出真知”。


如果你觉得我写的题解还不错的,请各位王子公主移步到我的其他题解看看

  1. 数据结构与算法部分(还在更新中):
  • C++ STL总结 - 基于算法竞赛(强力推荐
  • 动态规划——01背包问题
  • 动态规划——完全背包问题
  • 动态规划——多重背包问题
  • 动态规划——分组背包问题
  • 动态规划——最长上升子序列(LIS)
  • 二叉树的中序遍历(三种方法)
  • 最长回文子串
  • 最短路算法——Dijkstra(C++实现)
  • 最短路算法———Bellman_Ford算法(C++实现)
  • 最短路算法———SPFA算法(C++实现)
  • 最小生成树算法———prim算法(C++实现)
  • 最小生成树算法———Kruskal算法(C++实现)
  • 染色法判断二分图(C++实现)
  1. Linux部分(还在更新中):
  • Linux学习之初识Linux
  • Linux学习之命令行基础操作
  • Linux学习之基础命令(适合小白)
  • Linux学习之权限管理和用户管理
  • Linux学习之制作静态库和动态库
  • Linux学习之makefile
  • Linux学习之系统编程1(关于读写系统函数)
  • Linux学习之系统编程2(关于进程及其相关的函数)
  • Linux学习之系统编程3(进程及wait函数)
  • Linux学习之系统编程4(进程间通信)
  • Linux学习之系统编程5(信号)
  • Linux学习之系统编程6(线程)
  • Linux学习之系统编程7(线程同步/互斥锁/信号量/条件变量)

✨🎉总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”
在这里插入图片描述
如果有错误❌,欢迎指正哟😋

🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉

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

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

相关文章

httprunnermanager接口平台二次开发(十):平台实现发送邮件的功能[批量]

文章目录 一、诉求1.1、邮件功能是不是鸡肋二、思路三、问题3.1、修改:jinja2/runtime.py3.2、修改httprunner框架的report模块四、实现4.1、views.py先写接口4.2、report_list.html再写前端样式4.3、curd.js再写功能实现五、扩展5.1、完整的发送邮件功能:utils/email.py5.2、…

Java程序设计:必实验2 类的高级应用

(1)编写一个Athlete类。该类包含三个成员变量name、sport和medal,分别代表一个运动员的姓名、最擅长的运动项目名称和在2023年亚运会获得的奖牌数量。在该类中重写Object类的toString方法,当调用它重写的toString方法时&#xff0…

适用于Mac电脑的 iOS 设备管理器选 iTunes 还是iMazing?

mac上有没有好用的ios设备管理器? 因为工作的关系,一共使用3部苹果手机,资料很杂很多也很乱,想整理也不知道从何下手,有人推荐【iTunes】,有人推荐【iMazing】,该如何选择呢? 一、i…

架构师 - 架构师是做什么的 - 学习总结

架构师核心定义 架构师是什么 架构师是业务和技术之间的桥梁 架构师的核心职责是消除不确定性、和降低复杂性 架构设计环 架构师的三个核心能力 架构师的三个关键思维 架构师主要职责 架构设计 Vs 方案设计 架构设计前期 主要任务 澄清不确定性 明确利益干系人的诉求消除冲…

2024.1.13力扣每日一题——构造限制重复的字符串

2024.1.13 题目来源我的题解方法一 计数模拟 题目来源 力扣每日一题;题序:2182 我的题解 方法一 计数模拟 因为字符串s由小写字母构成,因此使用一个int[26]的数组保存每个字符的数量,然后从最大的字符开始构造结果字符串sb&…

段码液晶显示屏模块 背光控制的坑

玩的这个模块做测试,它的引脚有以下的介绍,商家提供了些资料,但没原理图。 led引脚想当然的接个IO输出口,但怎么输出0或1都不能控制背光 然后仔细研究了上面的电路,才发现LED是直接连接着VCC的 总结是这个背光要控制的…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法…

示例:php将文本内容写入一个文件(面向过程写法)

一、封装2个函数,读写文件 /*** desc 读取文件内容* param string $filename* return array*/ private function readContent(string $filename): array {$text file_get_contents($filename);if (!$text) {return [];}$result json_decode($text,true);return…

全包了 功能超级强大的linux管理平台1panel部署教程

目录 先看下效果 1.1panel是什么 2.安装教程 2.1下载安装包 2.2解压 2.3安装 3.查看 3.1初始化并登录 3.2容器管理页面,可以启动 重启 创建容器 ​编辑 3.3应用商店 意见安装常用应用 ​编辑 3.4可视化任务管理 3.5网站管理 3.6数据库管理 ​编辑 3…

关于使用CryPtopp库进行RSA签名与验签的一些说明

项目中使用到了CryPtopp库进行RSA签名与验签,但是在使用过程中反复提示无效的数字签名。在网上反复查阅相关资料无果,最后在CryPtopp官网找到相关资料。 再利用CryPtopp中的SignerFilter这个函数进行签名时,最后有一个变量bool putMessage&am…

iOS UIViewContentMode 不同效果图文对比

一. iOS提供了的ContentMode有如下几种 其中默认mode是UIViewContentModeScaleToFill typedef NS_ENUM(NSInteger, UIViewContentMode) {UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is tr…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第二天-C++类与对象练习题(物联技术666)

网盘链接:https://pan.baidu.com/s/1TKdHdeuDI8XPaakepvSLZQ?pwd=1688 提取码:1688 设计一个学生类,包括学号、姓名、成绩,并设计接口函数用来输出这些学生数据并计算平均分。并编写main函数进行测试: 输出如: 学号 姓名 成绩 1 张XX 98 2 王XX 90 3 XXX 89 平均…

Python教程44:海龟画图turtle画卡塔尔世界杯吉祥物

---------------turtle源码集合--------------- Python教程42:海龟画图turtle画海绵宝宝 Python教程41:海龟画图turtle画蜡笔小新 Python教程40:使用turtle画一只杰瑞 Python教程39:使用turtle画美国队长盾牌 Python教程38&a…

公共命名空间的表示方法

公共命名空间简介 曾经有人研究如何在电脑上显示汉字,研究的结果是:把汉字全记下来,需要哪个就显示哪个。具体来讲分两步走: ①建立字符集 ②设计字体 为了实现自然语言编程,也需要分两步走: ①把所有句子…

领域驱动设计解决汉诺塔问题-文风批评(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下文章内容纯属虚构,用来批评某些领域驱动设计文风。后续将挑一些近期的文章作为例子来批评。 ********** 领域驱动设计是革命性的创新,是划时代的洞见。领…

OpenCV-Python(40):光流算法

目标 光流的概念以及Lucas-Kanade 光流法使用函数cv2.calcOpticalFlowPyrLK() 对图像中的特征点进行跟踪 光流 介绍 由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D 向量场,可以用来显示一个点从第一帧图像到第二帧图像…

CLion、IDEA设置编码为utf-8,防乱码

其实只要是JetBrains的软件都是通用的,下面以IDEA为例 1.设置项目文件编码 2.设置控制台的字符编码

bash shell基础命令

1.shell启动 shell提供了对Linux系统的交互式访问,通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。 /etc/passwd/文件包含了所有用户的基本信息配置, $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ...例如上述root账户信…

【外汇天眼】误入假冒Ctrl Investments无法出金,投资者:太相信网友了!

在当下这个互联网迅速发展的时代,各类交友类APP成为人们拓展社交圈的新渠道。一方面这样的交友软件在满足了用户基础的社交要求,另一方面网络世界所交往的朋友能给用户带来的神秘感和新鲜感,所以导致一部分年轻人离不开这些交友软件。然而&am…

Python 两种多值参数

有时可能需要一个函数中处理的参数的个数是不确定的,就需要使用多值参数 参数名前加上*,代表可以接收元组参数名前加上**,代表可以接收字典 代码: def demo(*args, **kwargs):print(args)print(kwargs)demo(1, 2, 3, 4, 5, nam…