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.mfbz.cn/a/605223.html

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

相关文章

日志审计系统在提高网络安全方面具有哪些重要的作用

随着信息技术的飞速发展,我们正处于一个高度互联、数据驱动的网络时代。在这个时代,日志审计系统作为网络安全和信息管理的重要工具,发挥着至关重要的作用。下面德迅云安全就详细介绍下关于日志审计系统在当今网络时代的重要性。 一、什么是日…

第41天:WEB攻防-ASP应用HTTP.SYS短文件文件解析Access注入数据库泄漏

第四十一天 一、ASP-SQL注入-Access数据库 1.解释 ACCESS数据库无管理帐号密码,顶级架构为表名,列名(字段),数据,所以在注入猜解中一般采用字典猜解表和列再获取数据,猜解简单但又可能出现猜解…

Vue中使用$t(‘xxx‘)实现中英文切换;

(原文链接) 介绍 {{$t(key)}} :是VueI18n插件提供的函数,主要用于根据当前语言环境返回对应的翻译文本,以便在页面上显示多语言内容。 key:作为参数传递给函数$t()的字符串,用于指定需要翻译的…

uni-app实战在线教育类app开发

随着移动互联网的快速发展,教育行业也在不断向在线化、数字化方向转型。开发一款功能丰富、用户体验优秀的在线教育类 App 对于满足学习者需求、促进教育行业的发展至关重要。本文将介绍如何利用 Uni-App 进行在线教育类 App 的开发,让您快速上手&#x…

svg画扇形进度动画

有人问下面这种图好怎么画?svg 想了下,确实用svg可以,可以这么设计 外层是一个容器放置内容,并且设置overflow:hidden, 内层放一个半径大于容器宽高一半的svg,并定位居中,然后svg画扇形&#x…

如何评估大模型音频理解能力-从Gemini说起

Gemini家族包含Ultra、Pro和Nano三种大小的模型是谷歌开发的大型多模态人工智能模型,它在人工智能的多模态领域实现了重大突破,结合了语言、图像、音频和视频的理解能力。 Gemini的性能评估情况如下: Gemini模型的评估的具体指标从文本理解能…

量化地形处理

1: 量化地形切片:GDAL查询数据;CTB算法转mesh;高度图需要和周围高度图边界做高度融合,四顶点需要做平均值融合;法线想要在前端显示正确必须将mesh坐标转为4326或者3857; 这个使用开源即可:cesi…

【进程间通信】共享内存

文章目录 共享内存常用的接口指令利用命名管道实现同步机制总结 System V的IPC资源的生命周期都是随内核的。 共享内存 共享内存也是为了进程间进行通信的,因为进程间具有独立性,通信的本质是两个不同的进程看到同一份公共资源,所以共享内存…

数仓开发,分层(ods,dw,app层)

1、从数据源中导入源数据,到ODS表,作为事实表的数据 2、可以根据自己的开发设计,是否单独分支出来一个维度表,帮助和协助处理源数据表ODS层 和需求层ADS(APP)层 3、现在我们有了一个事实ODS层&#xff0…

【R语言】边缘概率密度图

边缘概率密度图是一种在多变量数据分析中常用的图形工具,用于显示每个单独变量的概率密度估计。它通常用于散点图的边缘,以便更好地理解单个变量的分布情况,同时保留了散点图的相关性信息。 在边缘概率密度图中,每个变量的概率密度…

Linux-信号保存

1. 概念 进程执行信号的处理动作,称为 信号递达(Delivery) 信号从产生到递达之间的状态,称为 信号未决(Pending) 进程可以选择 阻塞(Block)某个信号 过程: 信号产生 ——…

Java的BIO/NIO/AIO

1. Java中的BIO、NIO和AIO的基本概念及其主要区别 BIO (Blocking I/O): 传统的同步阻塞I/O模型。每个连接创建成功后都需要一个线程来处理,如果连接没有数据可读,则线程会阻塞在读操作上。这种模型简单易理解,但在高并发环境下会消耗大量系统…

苹果Mac用户下载VS Code(Universal、Intel Chip、Apple Silicon)哪个版本?

苹果macOS用户既可以下载通用版(Universal),软件将自动检测用户的处理器并进行适配。 也可以根据型号下载对应CPU的版本: 使用Intel CPU的Mac电脑可下载Intel Chip版本; 使用苹果自研M系列CPU的Mac电脑下载Apple Si…

Animation: (1) animatedline

目录 示例1:显示线条动画示例2:指定动画线条颜色示例3:指定日期时间和持续时间值示例4:设置最大点数示例5:批量添加点以生成快速动画示例6:使用drawnow limitrate创建快速动画示例7:定时更新屏幕…

如何获取中国各省市区的边界

前几个专栏我介绍了获取各流域边界的方法,可参见以下的文章: 格林兰岛和南极洲的流域边界文件下载-CSDN博客 读取shp文件中的经纬度坐标-CSDN博客 读取谷歌地球的kml文件中的经纬度坐标_谷歌地球识别穿过矿区的公路,并获取公路的经纬度坐标-CSDN博客 关于…

docker-compose部署gitlab

需要提前安装docker和docker-compose环境 参考:部署docker-ce_安装部署docker-ce-CSDN博客 参考:docker-compose部署_docker compose部署本地tar-CSDN博客 创建gitlab的数据存放目录 mkdir /opt/gitlab && cd mkdir /opt/gitlab mkdir {conf…

算法学习Day2——单调栈习题

第一题,合并球 题解:一开始写了一次暴力双循环,直接O(n^2)严重超时,后面于是又想到了O(n)时间复杂度的链表,但是还是卡在 最后一个数据会TLE,我也是高兴的拍起来安塞腰鼓和华氏护肤水,后面学长给…

内网安全【2】——域防火墙/入站出站规则/不出网隧道上线/组策略对象同步

-隧道技术:解决不出网协议上线的问题(利用出网协议进行封装出网)(网络里面有网络防护,防火墙设置让你不能正常访问网络 但有些又能正常访问,利用不同的协议tcp udp 以及连接的方向:正向、反向) -代理技术&…

《ESP8266通信指南》13-Lua 简单入门(打印数据)

往期 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客 《ESP8266通信指南》9-TCP通信(Arudino开发)-CSDN博客 《ESP82…

数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)

数据库管理185期 2024-05-08 数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)1 上期示例说明2 两个参数2.1 NEST/UNNEST2.2 CHECK/NOCHECK 3 一数多用3.1 以用户维度输出订单信息3.2 以产品维度3.3 以产品种类维度 4 美化输出总结 数…
最新文章