【网络】socket套接字基础知识
目录
IP地址和端口号
源IP地址和目的IP地址
端口号
源端口号和目的端口号
TCP/UDP协议
网络字节序
大小端
如何定义网络数据流地址
网络字节序和主机字节序的转换
socket编程接口
sockaddr结构
IP地址和端口号
源IP地址和目的IP地址
在IP数据包头部中,会有两个地址,一个叫做源IP地址,一个叫做目的IP地址。源IP地址是指发送数据包的主机的IP地址,而目的IP地址是指接收数据包的主机的IP地址。

在互联网中,每个主机都有一个唯一的IP地址,用于标识该主机的身份和位置。在数据包传输过程中,源IP地址和目的IP地址是用于确定数据包的来源和目的地的重要信息,以便正确地将数据包传输到目标主机。
但是,光有IP地址是不够的。假设你现在用微信向你的好朋友发送了一条消息,有了IP地址能将消息发送到对方的机器上。但是还需要一个特定的标识来区分这个数据要给哪一个程序进行解析。

基于上述的问题,引出端口号的概念,通过IP地址+端口号就能将数据发送给指定主机的某一个程序了。主机的唯一性由公网IP标识,而主机上的服务进程由端口号标识。
端口号
端口号(port)是传输层协议的内容。
●端口号是一个2字节16位的整数。
●端口号用来标识一个进程,告诉操作系统,当前的数据要交给哪一个进程来处理。
●IP地址+端口号能够标识网络上的某一台主机的某一个进程。
●在同一台主机上,同一个端口号不能标识多个进程。不同主机上的标识各自进程的端口号可以相同。
●一个进程可以绑定多个端口号,但一个端口号不能被多个进程绑定。

小疑问:如果端口号的功能是用来标识一个进程,为什么不用PID呢?两者之间有什么关系。
答:1.如果使用PID,进程每次重新启动,PID都可能会更改,PID变了,网络部分也要进行修改。采用端口号的方式,操作系统是操作系统,网络是网络(解耦)。2.服务器的唯一性不能做任何改变(IP+Port)。3.不是所有的进程都需要提供网络服务或者请求,但是所有进程都需要PID。
源端口号和目的端口号
源端口号和目的端口号在计算机网络中用于标识数据包发送和接收的进程或应用程序。源端口号是发送方计算机上的端口号,目的端口号是接收方计算机上的端口号。在TCP/IP协议中,源端口号和目的端口号都是16位的整数,取值范围是0~65535。
TCP/UDP协议
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)都是互联网协议中的传输层协议,用于在网络上传输数据。
TCP是一种可靠的、面向连接的协议,它通过三次握手建立连接,保证数据的可靠传输。TCP在传输数据时,会对数据进行分段,并为每个分段进行编号,接收方会对每个分段进行确认,如果发送方没有收到确认,就会重新发送数据。TCP还会对数据进行流量控制和拥塞控制,以避免网络拥塞和数据丢失。
●传输层协议●有连接●可靠传输●面向字节流
UDP是一种不可靠的、无连接的协议,它不会对数据进行分段和编号,也不会进行确认和重传。UDP适用于需要快速传输数据的应用,如实时音视频传输、在线游戏等。由于UDP没有TCP那么多的控制机制,因此它的传输效率更高,但也更容易出现数据丢失和网络拥塞的问题。
●传输层协议●无连接●不可靠传输●面向数据报
总的来说,TCP适用于需要可靠传输的应用,而UDP适用于需要快速传输的应用。需要注意的是上述的可靠和不可靠是中性词,只是特点不同,适用场景不同。
网络字节序
内存中的多字节数据相对于内存地址由大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端。
●发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
●接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
●网络数据流的地址规定:先发出的数据是低地址,后发出的数据是高地址。
●TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
●不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据。
●如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可。
大小端
小端模式下,数据的低位字节存储在内存的低地址处,高位字节存储在内存的高地址处。
大端模式下,数据的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。

如何定义网络数据流地址

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

网络字节序和主机字节序的转换

在上述的函数名中,h表示host,n表示network。l表示32位长整数。s表示16位短整数。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
socket编程接口
// 创建 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);
sockaddr结构
在我们进行网络通信的过程中,套接字的种类不止一种,比如:网络套接字编程,原始套接字和unix域间套接字。
网络套接字(Socket),它提供了一组用于网络通信的函数和数据结构,使得应用程序可以通过网络与其他应用程序进行通信。通过网络套接字,应用程序可以实现不同计算机之间的数据传输和通信。
原始套接字(Raw Socket),它允许程序直接访问网络协议栈,从而可以发送和接收任意类型的网络数据包,包括未经处理的数据包。相比于传统的套接字接口,原始套接字提供了更高的灵活性和更细粒度的控制,但也需要更多的编程工作和更高的权限。
域间套接字(Domain Socket),它只能在同一台计算机上的进程之间进行通信。与传统的网络套接字不同,域间套接字不需要经过网络协议栈的处理,因此具有更高的性能和更低的延迟。域间套接字通常用于本地进程之间的通信,比如在同一台计算机上的不同进程之间共享数据或者进行进程间通信等。
如果给不同的套接字各自设计一套接口就太麻烦,所以使用sockaddr结构的方式,通过给一套接口传递不同的参数,就解决了所有网络或者其他问题下的通信问题。
下述示意图以sockaddr_in(inet,网络通信)与sockaddr_un(unix,域间套接字)两个套接字类型为例:

在我们想要进行网络通信的时候,填充的是sockaddr_in(inet,网络通信)与sockaddr_un(unix,域间套接字)的字段。在参数传递的时候强转成sockaddr传递。
不管传递的参数是什么,在函数内部都当做sockaddr看待,根据前两个字节在做判断强转回去。这样一来,通过一套接口就可供不同的套接字调用。
相关文章:
【网络】socket套接字基础知识
目录 IP地址和端口号 源IP地址和目的IP地址 端口号 源端口号和目的端口号 TCP/UDP协议 网络字节序 大小端 如何定义网络数据流地址 网络字节序和主机字节序的转换 socket编程接口 sockaddr结构 IP地址和端口号 源IP地址和目的IP地址 在IP数据包头部中,会…...
Go语言介绍以及Go语言环境安装
初步介绍: Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源&am…...
FPGA纯verilog实现CameraLink视频接收和发送,附带工程源码和技术支持
目录 1、前言2、CameraLink协议基础3、目前我已有的CameraLink收发工程4、设计方案5、CameraLink解码模块详解6、CameraLink编码模块详解7、vivado工程详解8、上板调试验证9、福利:工程代码的获取 1、前言 FPGA实现CameraLink视频编解码目前有两种方案:…...
k8s中的service、api-server、kube-proxy有什么区别
在Kubernetes(K8s)中,Service、API Server和kube-proxy是三个不同的组件,它们在集群中扮演着不同的角色和功能。下面我将为你解释它们之间的区别: 1. Service(服务): Service是K8s中…...
记录::opencv编译,cmake编译vs动态库
环境:window7,cmake-gui,vs2013 opencv:3.4.4 opencv_contrib:3.4.4(nonfree模块,主要为了用sift) 链接:https://pan.baidu.com/s/1OXg2IRaxTLTVqM2PVR2ZFA 提取码&a…...
网易SmartAuto,中文编程就是爽
上一篇我们应该用中文编程发出来后,果不其然不少人很不以为然,还有直说“骗钱的,估计也没人会上当”。这样的反应是在预料之中。 行胜于言,我今天讲一个我们已经用了好几年的产品,用来做UI自动化测试的SmartAuto&#…...
适配器模式那么强大,该怎么使用呢?
适配器模式是一种常用的设计模式,它可以将两个不兼容的接口进行转换,从而使它们之间可以进行交互。在业务开发中,我们经常需要将不同的系统或服务进行整合,而这些系统或服务往往有着不同的接口和数据格式。适配器模式提供了一种解…...
[极客大挑战 2019]PHP1
既然提到了备份网站估计也是存在着网站备份文件,可以先用御剑扫一下 啥都没扫出来,但是上回做文件备份的题目时收集了一些关于常用备份文件的文件名和后缀,可以直接使用burp抓包爆破,果然爆破出一个www.zip文件 访问下载好文件就有…...
PID 学习
采样数据: X 1 , X 2 , X 3 . . . , X ( k − 1 ) , X k X_1,X_2,X_3...,X_(k-1),X_k X1,X2,X3...,X(k−1),Xk E k S v − X k E_kS_v-X_k EkSv−Xk ( S v S_v Sv 是用户设定值) 比例算法: O U T P K p ∗ E k O U T 0 OUT_PK_p*…...
002. java.lang.NumberFormatException: Infinite or NaN,怎么破?
你好,我是YourBatman:当我老了,也写代码;不为别的,只为爱好。 📚前言 如果你工作超5年,100%遇到过这个异常:java.lang.NumberFormatException: Infinite or NaN Infinite中文释义…...
Vue常用的修饰符
Vue常用的修饰符有哪些有什么应用场景 修饰符是什么 在Vue中,修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情,而能有更多的精力专注于程序的逻辑处理 分类、有5种 表单修饰符事件修饰符鼠标按键修饰符键…...
freertos笔记-任务切换
红叶何时落水 任务切换,调用PendSV #define taskYIELD() portYIELD() #define portYIELD() \ { \portNVIC_INT_CTRL_REG portNVIC_PENDSVSET_BIT; \ 通过向中断控制和壮态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中断\__dsb( portSY_FULL_READ…...
企业电子招投标采购系统源码之登录页面-java spring cloud
信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…...
接口测试|Fiddler弱网测试
Fiddler进行弱网测试 弱网测试 概念:弱网看字面意思就是网络比较弱,我们通称为信号差,网速慢。 意义:模拟在地铁、隧道、电梯和车库等场景下使用APP ,网络会出现延时、中断和超时等情况。 在这里插入图片描述 Fidd…...
Linux-0.11 文件系统super.c详解
Linux-0.11 文件系统super.c详解 模块简介 该模块主要包含了对超级块的一些读写操作。 函数详解 lock_super static void lock_super(struct super_block * sb)该函数的作用是锁定bh块。 cli();//关中断while (sb->s_lock)//如果已经被锁定sleep_on(&(sb->s_wai…...
什么是ChatGPT、历史发展及应用领域
什么是ChatGPT ChatGPT是一种基于深度学习的自然语言处理技术,它可以生成高质量的自然语言文本,该技术是由OpenAI团队开发,旨在使计算机能够像人类一样理解和产生自然语言。ChatGPT使用了深度神经网络和自然语言处理技术,通过对大…...
Spring的创建与使用
目录 1.创建 Spring 项⽬ 1.1 创建一个 maven 项目 1.2 添加 spring 框架支持(spring-context/spring-beans) 2.将 Bean (对象) 存储到 Spring (容器) 中 2.1 在resources中创建一个spring配置文件 2.2 将 Bean 对象存储到 Spring 当中 2.2.1 创建 Bean 对象 2.2.2 将B…...
抖音Flutter插件的使用
Flutter是一个开源的移动应用程序开发框架,由谷歌开发,支持Android和iOS。随着Flutter的发展和成熟,许多人开始使用它来开发跨平台应用程序。本文将介绍如何使用抖音的Flutter插件,以增强Flutter应用程序的功能。 1. 安装Flutter…...
Debezium报错处理系列之六十八:No resolvable bootstrap urls given in bootstrap.servers
Debezium报错处理系列之六十八:No resolvable bootstrap urls given in bootstrap.servers 一、完整报错二、错误原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sure that the same history topic isn‘t shared b…...
Python二级编程:分词去重
一、原题 参考编程模板,完善代码,实现以下功能。 利用 jieba 库实现中文分词。对分词后的列表进行去重处理,然后将分词结果中字符数大于等于 3 的词语&…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果