Linux 操作系统网络编程1

目录

1、网络编程

1.1 OSI 网络七层模型

1.1.1 OSI 参考模型

1.1.2 网络数据传输过程

2 传输层通信协议

2.1 TCP

2.1.1 TCP的3次握手过程

2.1.2 TCP四次挥手过程

2.2 UDP

3 网络编程的IP地址

4 端口

5 套接字


1、网络编程

1.1 OSI 网络七层模型

1.1.1 OSI 参考模型

网络模型作用:进行数据封装

        OSI 开放式系统互联。OSI模型把网络通信的工作分为7层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

        OSI只是存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用。后来人们对OSI进行了简化,合并了一些层,最终只保存了4层,从下到上分别是接口层、网络层,传输层和应用层,也就是后来的TCP/IP模型。

OSI 各层模型功能:

1-> 物理层

        利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

        数据单位:比特

        典型设备:光纤、电缆

2-> 数据链路层

        在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。

        数据单位:帧。

3-> 网络层

        通过 IP 寻址来建立两个节点之间的连接

4-> 传输层

        向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输,同时向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。

5-> 会话层

        组织和协调两个回话进程之间的通信,并对数据交换进行管理。

6-> 表示层

        表示层要完成的功能主要有不同数据编码格式的转换,提供数据压缩、解压缩服务,对数据进行加密、解密。

7-> 应用层

        直接向用户提供服务,完成用户希望在网络上完成的各种工作。

1.1.2 网络数据传输过程

        我们平常使用的程序( 或者说软件) 一般都是通过应用层来访问网络的, 程序产生的数据会一层一层地往下传输, 直到最后的网络接口层, 就通过网线发送到互联网上去了。数据每往下走一层, 就会被这一层的协议增加一层包装, 等到发送到互联网上时, 已经比原始数据多了四层包装。 整个数据封装的过程就像俄罗斯套娃。当另一台计算机接收到数据包时, 会从网络接口层再一层一层往上传输, 每传输一层就拆开一层包装, 直到最后的应用层, 就得到了最原始的数据, 这才是程序要使用的数据。

2 传输层通信协议

2.1 TCP

        TCP是面向连接的传输协议、可考性传输,建立连接时要经过三次握手, 断开连接时要经过四次挥手, 中间传输数据时也要回复 ACK 包确认, 多种机制保证了数据能够正确到达, 不会丢失或出错。

2.1.1 TCP的3次握手过程

1、 客户端发送 TCP 连接请求
        客户端会随机一个初始序列号 seq=x( client_isn) , 设置 SYN=1, 表示这是 SYN 握手报文。 然后 就可以把这个 SYN 报文发送给服务端了, 表示向服务端发起连接, 之后客户端处于同步已发送状态。


2、 服务端发送针对 TCP 连接请求的确认, 服务端收到客户端的 SYN 报文后, 也随机一个初始序列号(server_isn)(seq=y), 设置 ack=x+1, 表示收到了客户端的 x 之前的数据, 希望客户端下次发送的数据从x+1 开始。 设置 SYN=1 和 ACK=1。 表示这是一个 SYN 握手和 ACK 确认应答报文。最后把该报文发给客户端, 该报文也不包含应用层数据, 之后服务端处于同步已接收状态。


3、 客户端发送确认的确认
        客户端收到服务端报文后, 还要向服务端回应最后一个应答报文, 将 ACK 置为 1 , 表示这是一个应答报文 ack=y+1 , 表示收到了服务器的 y 之前的数据, 希望服务器下次发送的数据从 y+1 开始。 最后把报文发送给服务端, 这次报文可以携带数据, 之后客户端处于连接已建立 状态。 服务器收到客户端的应答报文后, 也进入连接已建立状态通过这样的三次握手过程, TCP 能够确保双方能够收到对方的请求和回应, 并且双方都知道彼此的初始序列号和确认号。 这样建立起来的连接可以提供可靠的数据传输和顺序控制。

        ACK: 确认序号有效。
        SYN: 发起一个新连接。

        CLOSED: 不在连接状态( 这是为方便描述假想的状态, 实际不存在)
        LISTEN: 等待从任何远端 TCP 和端口的连接请求。
        SYN_SENT: 发送完一个连接请求后等待一个匹配的连接请求。 syn_sent
        SYN_RCVD:这个状态表示接受到了 SYN 报文, 在正常情况下, 这个状态是服务器端的 SOCKET 在建立 TCP连接时的三次握手会话过程中的一个中间状态, 很短暂, 基本上用 netstat 你是很难看到这种状态的, 除非你特意写了一个客户端测试程序, 故意将三次 TCP 握手过程中最后一个 ACK 报文不予发送。 因此这种状态时, 当收到客户端的 ACK 报文后, 它会进入到 ESTABLISHED 状态ESTABLISHED: 表示一个打开的连接, 接收到的数据可以被投递给用户。 连接的数据传输阶段的正常状态。


为什么是三次握手, 为什么不是两次或者四次?
        主要原因: 防止已经失效的连接请求报文突然又传送到了服务器, 从而产生错误
如果采用两次握手会出现以下情况:
        客户端向服务器端发送的请求报文由于网络等原因滞留, 未能发送到服务器端, 此时连接请求报文失效,客户端会再次向服务器端发送请求报文, 之后与服务器端建立连接, 当连接释放后, 由于网络通畅了, 第一次客户端发送的请求报文又突然到达了服务器端, 这条请求报文本该失效了, 但此时服务器端误认为客户端又发送了一次连接请求, 两次握手建立好连接, 此时客户端忽略服务器端发来的确认, 也不发送数据, 造成不必要的错误和网络资源的浪费。如果采用三次握手的话, 就算那条失效的报文发送到服务器端, 服务器端确认并向客户端发送报文, 但此时
客户端不会发出确认, 由于客户端没有确认, 由于服务器端没有接收到确认, 就会知道客户端没有请求连接。为什么不是四次? 如果三次就能够确定正常连接, 就没有必要在进行确认, 来浪费资源了。

2.1.2 TCP四次挥手过程

        ESTABLISHED: 表示一个打开的连接, 接收到的数据可以被投递给用户。 连接的数据传输阶段的正常状态。

        FIN_WAIT_1: 等待远端 TCP 的连接终止请求, 或者等待之前发送的连接终止请求的确认。
        FIN_WAIT_2: 等待远端 TCP 的连接终止请求。
        CLOSE_WAIT: 等待本地用户的连接终止请求。
        CLOSING: 等待远端 TCP 的连接终止请求确认。
        LAST_ACK: 等待先前发送给远端 TCP 的连接终止请求的确认( 包括它字节的连接终止请求的确认)
        TIME_WAIT: 等待足够的时间过去以确保远端 TCP 接收到它的连接终止请求的确认。
数据传输完毕后, 双方都可释放连接。 最开始的时候, 客户端和服务器都是处于 ESTABLISHED 状态, 然后客户端主动关闭, 服务器被动关闭。
        FIN: 断开一个连接标志;
        第一次挥手:客户端发出连接释放报文, 并且停止发送数据。 释放数据报文首部, FIN=1, 其序列号为 seq=u( 等于前面已经传送过来的数据的最后一个字节的序号加 1) , 此时, 客户端进入 FIN-WAIT-1( 终止等待 1)状态。
        第二次挥手 服务器端接收到连接释放报文后, 发出确认报文, ACK=1, ack=u+1, 并且带上自己的序列号seq=v, 此时, 服务端就进入了 CLOSE-WAIT 关闭等待状态。
        第三次挥手 客户端接收到服务器端的确认请求后, 客户端就会进入 FIN-WAIT-2( 终止等待 2) 状态, 等待服务器发送连接释放报文, 服务器将最后的数据发送完毕后, 就向客户端发送连接释放报文, 服务器就进入了LAST-ACK( 最后确认) 状态, 等待客户端的确认。
        第四次挥手 客户端收到服务器的连接释放报文后, 必须发出确认, ACK=1, ack=w+1, 而自己的序列号是seq=u+1, 此时, 客户端就进入了 TIME-WAIT( 时间等待) 状态, 但此时 TCP 连接还未终止, 必须要经过 2MSL后( 最长报文寿命) , 当客户端撤销相应的 TCB 后, 客户端才会进入 CLOSED 关闭状态, 服务器端接收到确认报文后, 会立即进入 CLOSED 关闭状态, 到这里 TCP 连接就断开了, 四次挥手完成。

总结:
        * 面向连接, 类似我们手机打电话, 不管有没有人说话--通话都计时
        * 稳定的长连接通信
        * 速度相对来说比较慢
        * 一般不容易丢失数据 -- 有链接三次握手
        * 以及断开链接的四次挥手

2.2 UDP

        UDP 是非面向连接的传输协议, 没有建立连接和断开连接的过程, 它只是简单地把数据丢到网络中, 也不需要 ACK 包确认。 在数据传输过程中延迟小、 数据传输效率高。
当强调传输性能而不是传输的完整性时, 如: 音频和多媒体应用, UDP 是最好的选择。
总结:
        * 短链接, 不连接通信
        * 相对来说没有 TCP 那么稳定
        * 有可能丢失相应数据
        * 它的发送速度相对 TCP 来说比较快

3 网络编程的IP地址

        IP 地址是 Internet Protocol Address 的缩写, 译为“网际协议地址”。 在因特网上进行通信时, 必须要知道对方的 IP 地址。

1) shell 查看 ip
windows 下: ipconfig
Linux 下: ifconfig
2) ipv4
        ipv4 地址是一个 32 位(bit)地址数据(unsigned int)
        1> 点分十进制表示 IP
                8 位合成一个数值, 用.隔开, 这种表达方式即为点分十进制
                例如 点分十进制: 192.168.110.59
                0.0.0.0 -- 255.255.255.255
2> ip 由网络号和主机号组成
        网络号: 区分局域网
        主机号: 区分同一个局域网内不同的设备
        IP 地址根据网络 ID 的不同分为 5 种类型

A 类地址: 0.0.0.0-127.255.255.255
        第一个字节 IP 网络号, 后三个字节为主机字节
        A 类地址你是无法得到的, A 类地址是用于超级公司/国家政府的地址
B 类地址: 128.0.0.0-191.255.255.255
        前两个字节为 IP 网络号, 后两个字节为主机字节
        一般也适用于大型公司
C 类地址: 192.0.0.0-223.255.255.255
        前三个字节为 IP 网络号, 后一个字节为主机地址
D 类地址: 在历史上被叫做多播地址(multicast address), 即组播地址
        224.0.0.0 到 239.255.255.255。
E 类地址: 广播地址, 用于研究使用

3> 由于科技发展, 电子设备增多, IP 地址不够用, 出现 ipv6 地址(128 位地址数据) 2^128
4> 子网掩码: 网络号为 1 主机号为 0
        例如: 192.168.110.123
        子网掩码: 255.255.255.0 ( c 类)

5> 网关: 网络号不变, 主机号为 0
        例如: 192.168.110.123
        网关: 192.168.110.0 ( C 类 IP)

4 端口

        一台计算机可以同时提供多种网络服务, 例如 Web 服务( 网站) 、 FTP 服务( 文件传输服务) 、 SMTP 服务( 邮箱服务) 等, 仅 5 有 IP 地址, 计算机虽然可以正确接收到数据包, 但是却不知道要将数据包交给哪个网络程序来处理, 所以为了区分不同的网络程序, 计算机会为每个网络程序分配一个独一无二的端口号( PortNumber)

端口的数据类型: unsigned short 范围: 0-65535
端口分为
        1) 知名端口号
                知名端口号是系统程序使用的端口号. 知名端口范围从 0 到 1023.
        2) 动态端口号
                动态端口号是普通程序使用的端口号. 动态端口的范围是从 1024 到 65535. 当这个程序关闭时,
        同时也就释放了所占用的端口号, 一般建议使用 10000 以上。 10000-65535

5 TCP 协议编程框架

5 套接字


        套接字是计算机之间进行通信的一种约定或一种方式。 通过 socket 这种约定, 一台计算机可以接收其他计算机的数据, 也可以向其他计算机发送数据。
        socket 的典型应用就是浏览器: 浏览器获取用户输入的 URL( 统一资源定位符) , 向服务器发起请求,服务器分析接收到的 URL, 将对应的网页内容返回给浏览器, 浏览器再经过解析和渲染, 就将文字、 图片、视频等元素呈现给用户。
        UNIX/Linux 中的 socket 是什么? UNIX/Linux 程序在执行任何形式的 I/O 操作时, 都是在读取或者写入一个文件描述符。 一个文件描述符只是一个和打开的文件相关联的整数, 它的背后可能是一个硬盘上的普通文件、 FIFO、 管道、 终端、 键盘、 显示器, 甚至是一个网络连接。
请注意, 网络连接也是一个文件, 它也有文件描述符! 我们可以通过 socket() 函数来创建一个网络连接, 或者说打开一个网络文件, socket() 的返回值就是文件描述符。 有了文件描述符, 我们就可以使用普通的文件操作函数来传输数据了, 网络编程原来就是如此简单!

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

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

相关文章

Linux cmake 初窥【3】

1.开发背景 基于上一篇的基础上,已经实现了多个源文件路径调用,但是没有库的实现 2.开发需求 基于 cmake 的动态库和静态库的调用 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上,增加了动态库…

优思学院|精益六西格玛黑带培训的内容有哪些?【附思维导图】

引言 在现代企业中,精益六西格玛黑带(或称六西格玛黑带)处于实施六西格玛方法的最前线。然而,他们的职责远不止执行者的角色。黑带既学习六西格玛的工具,又主导项目以改进绩效指标。在更长远的角度看,他们…

擎天科技与禅道合作,打造统一的项目管理平台

统一、全面的项目管理平台能够帮助企业优化管理流程,提升业务效率。擎天集团选择与禅道软件合作,打造统一的项目管理平台,在降低自研软件的研发成本、打破团队信息孤岛、保障数据全面性等方面效果显著,大大提高了团队沟通协作效率…

25852-47-5,MAc-PEG-MAc通常作为高分子材料的交联剂,以提高材料的力学性能和稳定性

【试剂详情】 英文名称 Methacrylate-PEG-Methacrylate,MAc-PEG-MAc 中文名称 甲基丙烯酸酯-聚乙二醇-甲基丙烯酸酯 CAS号 25852-47-5 外观性状 由分子量决定,固体或者液体。 分子量 0.4k,0.6k,1k,2k&#xf…

基于51单片机的温度检测自动调节设计—温度上下限报警自动控制

基于51单片机的温度自动调节 (仿真+程序原理图+设计报告) 功能介绍 具体功能: 1.DS18B20检测温度给单片机处理; 2.LCD1602显示实时温度、温度上下限; 3.三个按键可设置温度上下限&#xff1…

【项目】使用Yolov8 + tesseract 实现“营业执照”信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于毕业设计参考、实验等,营业执照分为横版和竖版,整体检测+识别效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录

【JUC】并发编程 Synchronized 锁升级原理

Synchronized如何实现同步/互斥的效果? monitorenter: 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象,将锁记录位状态改为10 monitorexit: 将锁对象对象头中Mark Word进行重置,重新恢…

蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 足球赛上,只见Q神如闪电般的速度带球时而左,时而右,时而前,时而后&#xff…

第二证券|摘星脱帽行情火爆 超40只ST股候场

5月8日,ST中嘉、*ST明诚强势涨停,2家公司年内均请求吊销危险警示。其间ST中嘉自4月29日以来,已接连录得5个涨停板;*ST明诚自4月23日以来9个交易日录得8个涨停板。 年报季向来是几家欢喜几家愁的时间,有公司披星戴帽&a…

【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品

1.题目 2. 解法⼀(暴⼒解法,会超时): 1.算法思路: 2.图解 3. 代码实现 3. 解法⼆(双指针-对撞指针): 1.算法思路: 2.图解 3.代码实现 1.C语言 2…

如何快速学习VCU电控开发

本课程基于实际项目案例和岗位需求技能制定教学大纲,以任务驱动方式引导学员,让学员快速掌握VCU开发知识。首先从VCU开发必备知识点和MATLAB/Simulink软件建模工具的使用入手,夯实学员基础。再通过策略设计、模型搭建和测试标定来指导学员完成…

AI图书推荐:使用FastAPI框架构建AI服务

《使用FastAPI构建生成式AI服务》(Building Generative AI Services with FastAPI (Early Release) )是一本由Ali Parandeh编写的书籍,计划于2025年3月首次出版,该书以实践为导向,指导读者如何开发具备丰富上下文信息的…

【k8s多集群管理平台开发实践】十二、开发总结及注意事项【完结】

文章目录 简介总结前面11章节所实现的功能: 一.完善集群更多功能1.1.可以扩展更多的功能 二.该系列课程代码地址三.技术栈及开发经验3.1.开发过程中所使用到的一些技术栈 四.开发过程中需要注意的事项五.反馈与交流 简介 该系列文章主要是介绍了多k8s集群平台开发的…

【前端】CSS基础(1)

文章目录 前言一、CSS基础1、 CSS是什么2、 CSS基本语法规范3、 代码风格3.1 样式格式3.2 样式大小写3.3 空格规范 4、 CSS引入方式4.1 内部样式表4.2 行内样式表4.3 外部样式 前言 这篇博客仅仅是对CSS的基本结构进行了一些说明,关于CSS的更多讲解以及HTML、Javasc…

iOS MRC那句话

混编时使用MRC文件需要使用这句话 -fno-objc-arc在下图中显示的位置添加

Pytorch常用的函数(九)torch.gather()用法

Pytorch常用的函数(九)torch.gather()用法 torch.gather() 就是在指定维度上收集value。 torch.gather() 的必填也是最常用的参数有三个,下面引用官方解释: input (Tensor) – the source tensordim (int) – the axis along which to indexindex (Lo…

JumpServer发布web应用

项目背景: 由于防火墙密码安全没有达到审计要求,需要加固防火墙用户安全,通过JumpServer发布防火墙登录页面,提供远程访问 认证要求: 1、密码记忆多次 2、密码大小写 3、密码字符 4、密码数字 加固前密码策略&…

详解BOM编程

华子目录 BOM编程window对象常见的window对象的属性常见的window对象的方法注意 history对象history对象的属性history对象的方法 screen 对象navigator 对象属性方法 location对象属性方法示例 BOM编程 JavaScript本质是在浏览器中运行,所以JavaScript提供了BOM&a…

初学java

注意点 1.使用关键字long的时候,在其赋值的时候要在后面加上大写或者小写的l,个人推荐大写,小写与数‘1’难区分。 2.函数的名字要与文件夹的名字相同,并且文件夹后面一定要有.java。例如这个的名字是Main,函数就得用这个&#x…

docker学习笔记(四)制作镜像

目录 第1步:编辑Dockerfile 第2步:编辑requirements.txt文件 第3步:编辑app.py文件,我们的程序文件 第4步:生成镜像文件 第5步:使用镜像,启动容器 第6步: 启动redis容器、将容器…