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://xiahunao.cn/news/3020761.html

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

相关文章

nginx代理原理(端口复用)探究

前言:对于一些常用的插件,我们应该学会如何使用。同时,其实现原理也要进行深究,可以为其他的项目开发做借鉴。 探究方案: 一、发布两个不同的服务,这两个服务的端口不致 二、配置nginx,让这两…

【Python爬虫】使用request和xpath爬取高清美女图片

📝个人主页:哈__ 期待您的关注 目录 🎈 urlib.request 🔥具体的方法 ✈ lxml 🔥xpath的基本语法 1. 基本路径 2. 选择节点 3. 谓语(Predicates) 4. 通配符 5. 选择多个路径 6. 函数 …

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

Python | Leetcode Python题解之第70题爬楼梯

题目: 题解: class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

Etcd集群选举细节

日志级别 在 etcd 集群中,领导者选举是 Raft 协议的一部分,用于在当前领导者失败或无法与集群中的其他节点通信时选出新的领导者。以下是您提供的日志中与领导者选举相关的一些关键条目,以及对它们的详细说明: 节点失去领导者&am…

IP定位技术在解决“薅羊毛”问题中扮演着关键角色

IP定位技术在解决被“薅羊毛”问题中扮演着关键角色。所谓“薅羊毛”,通常指的是在网络平台上,通过不正当手段获取优惠、奖励或利润的行为。这种行为不仅损害了平台的经济利益,也破坏了公平竞争的市场环境。IP定位技术通过提供IP地址的地理位…

2024年最适合做的母婴赛道,选品思路揭秘,教你如何选品!

大家好,我是电商花花。 在我印象中,每年都有人唱衰抖音小店不好做了,太卷了,普通人没有机会了,但是现在直播电商时代,很多信息都会片面的,做不好并不是因为不好做,而是因为你做不好…

本地项目上传到gitee

1. 新建仓库,不要勾选 2. git init git add . git commit -m "test" git remote add origin 【url】 git push --set-upstream origin master

什么样的行业适合做私域?

私域营销适用于各种行业,但以下几个行业尤其适合进行私域营销: 1、零售行业:私域营销可以帮助零售企业建立与顾客的直接联系,提高顾客忠诚度和复购率。通过私域营销,零售企业可以进行个性化推荐、定制化服务&#xff…

为什么创业青年,集体选择抖音小店?是藏在抖音里的财富密码!

哈喽~我是电商月月 为什么创业青年,集体选择抖音小店?因为在这开店不需要自己直播卖货做引流,也不需要自己手里有商品呀 是不是很匪夷所思,别怀疑,给我俩分钟你们绝对不后悔自己的停留! 首先就是社会的现…

WEB基础--JDBC基础

JDBC简介 JDBC概述 数据库持久化介绍 jdbc是java做数据库持久化的规范,持久化(persistence):把数据保存到可掉电式存储设备(断电之后,数据还在,比如硬盘,U盘)中以供之后使用。大多数情况下,特别是企业级…

Jackson 中使用 Optional

介绍 在本文中,我们会对 Optional 类进行一些说明,并且会解释下如果在使用 Optional 类的时候可能在 Jackson 中进行序列化和反序列化的过程中出现的问题。 针对上面的问题,本文会将会介绍在 Jackson 中如何处理 Optional 对象,…

追踪攻击数据包中的真实IP地址:方法与技巧

在网络安全领域,追踪攻击数据包中的真实IP地址是一项至关重要的任务。通过确定攻击者的真实IP地址,可以有效地识别和阻止网络攻击行为,提高网络安全防御水平。IP数据云IP地址查询将介绍几种常用的方法和技巧,帮助安全人员有效追踪…

创建禁止操作区域并且添加水印

css 设置 : 引用换成自己就好 .overlay {z-index: 1000;cursor: none; /*设置为不可点击*/user-select: none; /*设置为不可选择*/contenteditable: false; /*设置为不可编辑*/draggable: false; /*设置为不可拖动*/position: absolute;top: 0;left: 0;width: 100…

gpt_academic的使用——含一键安装和接入其他API以及本地模型

https://github.com/binary-husky/gpt_academic/releases/ https://github.com/binary-husky/gpt_academic/wiki 安装

计算机组成原理(超详解!!) 第七节 中央处理器(上)

1.CPU的功能和组成 CPU的功能: 指令控制:程序的顺序控制。 操作控制:管理并产生每条指令的操作信号,并把它们送到相应部件,控制这些部件按要求进行动作。 时间控制:对各种操作实施…

SpringBoot项目部署到阿里云服务器

部署步骤 步骤分以下: 将SpringBoot项目打包Linux上准备好Java环境、可用的MySql数据库项目上传到服务器启动项目停止项目 1.SpringBoot项目打包 数据库的链接,账户和密码需要和Linux上一致。 如上图打包即可。 2.Linux上准备好Java环境以及Mysql环境…

软件可靠度计算

软件的整体可靠度依据:若是单个就是当前部件的可靠度。若是多个部件,就需要多个部件的可靠度相乘。若是多个部件且有相同备份,那么计算公式更加不一样。 计算公式: 部件数:N 部件可靠度均为:R 单个部件的可…

uniapp + vue3 使用axios

场景 uniapp自带的uni.request不太好用,也有可能是自己用axios用的太熟悉了,所以还是用axios趁手点,所以尝试在uniapp中使用axios。 操作 因为uniapp项目没有package.json,所以先在项目根目录下执行 npm init, 执行完毕后直接…

【京东电商API接口】 | 京东某商品销量数据分析可视化

Python当打之年 当打之年,专注于各领域Python技术,量的积累,质的飞跃。后台回复:【可视化项目源码】可获取可视化系列文章源码和数据 本期将利用Python分析「京东商品数据接口」,希望对大家有所帮助,如有疑…