【Linux】Socket(初识网络)

news2024/11/15 13:31:42

目录

  • 一、网络初识
    • 1.协议
    • 2.OSI七层模型
    • 3.TCP/IP五层模型
    • 4.通讯原理图解
  • 二、socket
    • 1.源IP和目的IP
    • 2.端口号
    • 3.端口号和进程ID
    • 4.初识TCP、UCP协议
    • 5.网络字节序
  • 三、socket接口
    • 1.常见API
    • 2.sockaddr结构

一、网络初识

网络在计算机中的位置。

网络也是一种软件,所以网络也是可以分层的。
在这里插入图片描述

1.协议

协议" 是一种约定。

计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息, 就需要约定好双方的数据格式 。

2.OSI七层模型

1.OSI(open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
2.把网络从逻辑上分为了7层,每一层都有相关,相对应的物理设备,比如路由器,交换机;
3.OSI七层模型市一中框架的设计方法,其主要的功能就是帮助不同类型的主机实现数据传输。
4.它的最大优点市将服务,接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
5.但是,它既复杂也不使用,我们按照TCP/IP四层(五层)模型学习

在这里插入图片描述

3.TCP/IP五层模型

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇,TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫他的下一层所提供的网络来完成自己的需求。

  • 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,
    现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层。

  • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作.
    有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层。

  • 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层。

  • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机。

  • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层。

4.通讯原理图解

在这里插入图片描述

二、socket

1.源IP和目的IP

对于一个报文来讲,即表示从哪里来,到哪里去。

最大的意义:指导一个报文该如何进行路径选择。

2.端口号

端口号(port)是传输层协议的内容.

  • 端口号是一个2字节16位的整数;

  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;

  • IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;

  • 一个端口号只能被一个进程占用 。

3.端口号和进程ID

我们知道pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?

一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定 。

IP地址(公网IP)唯一的标识互联网中的唯一一台主机,端口号唯一的标识主机上的唯一一个进程;即 IP+port端口号 = 互联网中的唯一的一个进程。

在这里插入图片描述
要先通信,本质为: 先找到目标主机。再找到该主机上的服务(进程)。

所以在互联网世界中,其实就是一个进程间通信。

4.初识TCP、UCP协议


tcp协议:传输层协议、有连接、可靠传输、面向字节流。

udp协议:传输层协议、无连接、不可靠传输、面向数据报。

tcp虽然是可靠传输,udp是不可靠传输,不代表tcp就比udp协议更好,而需要根据应用场景合理选择。

5.网络字节序

内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏 移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;

  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;

  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.

  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.

  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;

  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t htohl(uint32_t netlong);
uint16_t htons(uint16_t netshort);
  • 这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。

  • 例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。

  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;

  • 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

三、socket接口

1.常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

网络通信的标准方式有很多种,比如:基于ip的网络通信:AF_INET,原始套接字,域间套接字。

它们都能使用同一套接口进行通信。而sockaddr就是这样的一种通用结构。

2.sockaddr结构

在这里插入图片描述

上面所提到的所有接口中,都只能用sockaddr结构,所以当使用网络套接字(AF_INET)和域间套接字(AF_UNIX)时都必须要强转成sockaddr使用。其本质类似于多态。

socket

socket的作用: 为网络通信创建一个 socket 文件。

socket的参数:
 ① domain:指定协议家族。我们选择 AF_INET 。
 ② type:指定套接字类型。对于 TCP SOCK_STREAM ,应选择 ;对于 UDP ,应选择 SOCK_DGRAM 。
 ③ protocol:指定协议类型。在 TCP 和 UDP 中,我们设为 0 即可。

socket的返回值:
 ① 成功,返回一个 socket 文件描述符。
 ② 错误,返回 -1 。

头文件
在这里插入图片描述

bind

bind的作用: 将本地地址和一个 socket 文件进行绑定。

bind的参数:
 ① sockfd:传入 socket 文件描述符。
 ② addr:用于指定本端的 socket 信息。
 ③ addrlen:用于指定本端的 socket 信息的大小。

bind的返回值:
 ① 成功,返回 0 。
 ② 错误,返回 -1 。

头文件
在这里插入图片描述

recvfrom

recvfrom的作用: 从一个 socket 文件接收数据。

recvfrom的参数:
 ① sockfd:传入 socket 文件描述符。
 ② buf:用于存放读到的数据的用户层缓冲区。
 ③ len:用户层缓冲区的大小。
 ④ flags:读的方式。我们这里默认设为 0 即可。
 ⑤ src_addr:输入输出型参数,用于获取对端的 socket 信息。
 ⑥ addrlen:输入输出型参数,用于获取对端的 socket 信息的大小。

recvfrom的返回值:
 ① 成功,返回接收的字节数(当对端连接关闭时,返回 0)。
 ② 错误,返回 -1 。

参数
在这里插入图片描述

sendto

sendto的作用: 从一个 socket 文件发送数据。

sendto的参数:
 ① sockfd:传入 socket 文件描述符。
 ② buf:用于发送数据的用户层缓冲区。
 ③ len:发送数据的长度。
 ④ flags:发送的方式。我们这里默认设为 0 即可。
 ⑤ dest_addr:目标对端的 socket 信息。
 ⑥ addrlen:目标对端的 socket 信息的大小。

sendto的返回值:
 ① 成功,返回发送的字节数。
 ② 错误,返回 -1 。

头文件
在这里插入图片描述

listen

listen的作用: 设置一个socket文件为监听状态,允许该socket文件被连接。

listen的参数:
 ①sockfd:传入socket文件描述符
 ②backlog:设置连接队列的最大长度

listen的返回值:
 ①成功,返回0
 ②失败,返回-1

头文件
在这里插入图片描述

accept

accpet的作用: 从一个socket文件接受连接。

accept的参数:
 ①sockfd:传入listen状态的socket文件描述符
 ②addr:输入输出型参数,获取对端的socket信息
 ③addrlen:输入输出型参数,获取对端的socket信息的大小。

accept的返回值:
 ①成功,返回一个文件描述符
 ②失败,返回-1;

头文件
在这里插入图片描述

connect

connect的作用:在一个socket文件上向目标发起连接

connect的参数:
 ①sockfd:传入socket文件描述符
 ②addr:目标对端的socket信息
 ③addrlen:目标对端的socket信息的大小

connect的返回值:
 ①成功,返回0
 ②失败,返回-1

头文件
在这里插入图片描述

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

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

相关文章

将设计模式门面模式运用到生活当中

文章目录 &#x1f31f; 如何将设计模式门面模式运用到生活当中&#x1f34a; 家居篇&#x1f389; 门锁控制&#x1f389; 窗帘控制 &#x1f34a; 旅游篇&#x1f389; 行程规划&#x1f389; 旅游出行 &#x1f34a; 金融篇&#x1f389; 网上银行&#x1f389; 投资产品 &a…

prosemirror 学习记录(四)decoration

使用 decorations 使用 props - decorations() 添加 decorations 写一个简单的插件&#xff1a;高亮所有 apple 节点 export const MyHighlightApplesPlugin new Plugin({props: {// view 每次变化都会执行 decorations 方法decorations(state) {let arrs [];state.doc.de…

Linux常用命令——chsh命令

在线Linux命令查询工具 chsh 用来更换登录系统时使用的shell 补充说明 chsh命令用来更换登录系统时使用的shell。若不指定任何参数与用户名称&#xff0c;则chsh会以应答的方式进行设置。 语法 chsh(选项)(参数)选项 -s<shell 名称>或--shell<shell 名称>&a…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.10 总结QT中的事件传递流程

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.10 总结事件传递流程(1) 事件处理函数接受还是忽略 本章要实现的整体效果如下&#xff1a; 事件传递总流程图&#xff0c;如下&#xff1a; 这张图是不是还不太明白&#xff1f;&#xff1f; 别…

《CS2》隆重登场,艾尔莎EA H610M-I和你征战新版本

作为电竞游戏的常青树&#xff0c;《反恐精英》的热门程度可以说是经久不衰。虽然《反恐精英》已经迭代了许多个版本&#xff0c;但是上一次大版本更新已经是2012年的《CS:GO》了。最近&#xff0c;V社正式上线了全新的《CS2》&#xff0c;它是由Source2引擎所开发&#xff0c;…

Nat. Methods | 哈佛李恒组开发三代HiFi宏基因组组装软件--hifiasm-meta

使用hifiasm-meta进行Hifi长读宏基因组序列组装 Metagenome assembly of high-fidelity long reads with hifiasm-meta Article&#xff0c;2022-05-09 Nature methods, [IF 48] DOI&#xff1a;https://doi.org/10.1038/s41592-022-01478-3 原文链接&#xff1a;https://www.n…

全连接=可编程!玻色量子成功研制光量子测控一体机——“量枢”

近日&#xff0c;北京玻色量子科技有限公司成功完成了光量子测控一体机——“量枢”的研制&#xff0c;作为一款光量子信号测量反馈控制设备&#xff0c;它是专门为相干光量子计算机定制的一套集光量子测量反馈、系统状态检测、计算流程控制等功能于一身的智能系统。 玻色量子自…

腾讯联手警方重拳出击,平阳警方斩断特大外挂黑色产业链

近期&#xff0c;在闲游盒腾讯守护者计划安全团队的协助下&#xff0c;平阳警方成功破获一起特大《绝地求生》外挂案件。捣毁了一个集外挂作者、卡盟平台、一级代理销售商、二级代理销售商等多个环节为一体的网络黑色产业链&#xff0c;共抓捕34名犯罪嫌疑人。 2018年5月初&…

什么是React中的context(上下文)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…

51单片机的PWM控制呼吸灯

文章目录 前言一、PWM引脚以及寄存器的配置二、呼吸灯逻辑总结 前言 hello 大家好这里是夏目学长的51单片机课堂&#xff0c;本篇博客是夏目学长观看B站up主学电超人的视频所写的一篇51单片机入门博客之51单片机PWM配置呼吸灯 &#xff0c;我自己在学习这节课程的时候觉得这节…

【MySQL--->内置函数】

文章目录 [TOC](文章目录) 一、日期函数二、字符串函数三、数学函数四、其他函数 一、日期函数 current_date();当前日期 current_time();当前时间 current_timestamp();当前时间戳 now();当前时间 date(‘date’);日期 date_sub(date,interval number second/minute/hour/d…

18.2 使用NPCAP库抓取数据包

NPCAP 库是一种用于在Windows平台上进行网络数据包捕获和分析的库。它是WinPcap库的一个分支&#xff0c;由Nmap开发团队开发&#xff0c;并在Nmap软件中使用。与WinPcap一样&#xff0c;NPCAP库提供了一些API&#xff0c;使开发人员可以轻松地在其应用程序中捕获和处理网络数据…

基于PyTorch的MNIST手写体分类实战

第2章对MNIST数据做了介绍&#xff0c;描述了其构成方式及其数据的特征和标签的含义等。了解这些有助于编写合适的程序来对MNIST数据集进行分析和识别。本节将使用同样的数据集完成对其进行分类的任务。 3.1.1 数据图像的获取与标签的说明 MNIST数据集的详细介绍在第2章中已…

基于springboot实现就业信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现就业信息管理系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;就业信息管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人…

最新Unity DOTS教程之BlobAsset核心机制分析

最近DOTS发布了正式的版本, 我们来分享一下DOTS里面BlobAsset机制&#xff0c;方便大家上手学习掌握Unity DOTS开发。 BlobAsset 概叙 DOTS提供了BlobAsset机制来把数据生成高效的二进制数据。BlobAsset的数据是不可变的。BlobAsset只支持非托管类型数据。支持Burst编译器编译…

计时的vue写法

<el-input type"text" id"timetext" value"00时00分00秒" readonly></el-input> <el-button type"button" click"start()">开始</el-button> <el-button type"button" click"st…

用Visual Studio(VS)开发UNIX/Linux项目

目录 FTP是免不了的 正确设置头文件 组织项目结构 创建何种项目类型 FTP自动上传 大部分具有Windows开发经验的程序员会比较喜欢使用Visual Studio&#xff0c;而大部分Unix/Linux程序员则喜欢使用UltraEdit直接在主机上写代码。 为什么直接在主机上写代码呢&#xff0c;因…

软考系列(系统架构师)- 2015年系统架构师软考案例分析考点

试题一 软件架构&#xff08;质量属性效用树、架构风险、依够点、权衡点&#xff09; 【问题1】&#xff08;12分&#xff09; 在架构评估过程中&#xff0c;质量属性效用树&#xff08;utility tree&#xff09;是对系统质量属性进行识别和优先级排序的重要工具。请给出合适的…

第20章 Netty

20.1 说说IO的交互流程 难度:★ 重点:★ 白话解析 这道题主要是用来帮助理解后面题目的,IO交互主要分为两种:本地IO和网络IO。 1、本地IO:数据在磁盘上,通过系统调用read()方法读取数据到内核空间的缓冲区,然后再读取到 用户空间的缓冲区,这就是IO的交互过程。 2、网…