Linux网络编程

2023-09-17 20:29:22

一.协议

1.1什么是协议

从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。

假设,A、B双方欲传输文件。规定:
第一次,传输文件名,接收方接收到文件名,应答OK给传输方;

第二次,发送文件的尺寸,接收方接牧到该数据再次应答一个OK; 
第三次.传输文件内容。同样.接收方接收数据完成后应答OK表示文件内容接收成功。,
        由此,无论A、B之间传递何种文,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。
        这种仅在A、B之间被遵守的协议称之为原始协议。当此协议被更多的人采用,不断的增加、改进、维护、完善。最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为一个标准协议。最早的 ftp协议就是由此衍生而来。·
TCP 协议注重数据的传输。http协议着重于数据的解释。

1.2典型协议

传输层:常见协议有 TCP/UDP协议。
应用层:常见的协议有HTTP协议,FTP协议。
网络层:常见协议有IP协议、ICMP协议、IGMP协议。

网络接口层:RARP协议,以太网帧协议。

1.3分层模型结构

   OSI七层模型:

物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

   TCP/IP四层模型:

网络接口层,网络层,传输层,应用层

    通信过程:

数据在封装之前不能传输

 应用层需要封装,传输层,网络层,链路层系统内核自己封装

以太网帧协议:

        ARP协议:根据IP地址获取MAC地址,ARP广播

二.网络套接字函数

2.1IP地址转换函数

将字符串转化为数值型,或数值型转化为字符型

#include <arpa/inet.h>
int inet_pton(int af,const char *src, void *dst); 
const char *inet_ntop.(int af,const void *src,char *dst,socklen_t size); 

int inet_pton(int af,const char *src,void *dst) :
af: AF_INET、AF_INET6
   src:传入,IP地址(点分十进制)
   dst:传出,转换后的网络字节序的IP地址。192.168.1.10l
   返回值:
      成功:1
      异常:0,说明src指向的不是一个有效的ip地址。

const char *inet_ntop(int af,const void *src,char *dst,sock1en_t size);
网络字节序--->本地字节序(string IP)
   af:AF_INET、AF_INET6
   src:网络字节序IP地址
   dst。本地字节序(string IP)size:dst 的大小。
   返回值:

      成功: dsto
      失败:NULL
 

2.2大小端转换函数

计算机采用小端法,网络存储采用大端法。

uint32_t htonl(uint32_t hostlong); // 本地转网络
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
/*
h表示host,n表示network,l表示32位长整数,s表示16位短整数。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
*/

2.3strcut   sockaddr结构

 struct sockaddr_in {
               sa_family_t    sin_family; /*  AF_INET */
               in_port_t      sin_port;   /* 端口号*/
               struct in_addr sin_addr;   /* IP地址结构体, */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* IP地址,数值类型 */
           };

adir. sin_addr. s_addr = hton1 (INADDR_ANY); 

取出系统中有效的任意IP地址,转为大端存储。二进制类型。

2.4socket模型创建流程图

 服务器端有两个文件描述符,一个建立连接后被解放后,开始进行监听,另一个进行通信

2.5socket函数

socket:创建一个套接字 

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

domain:AF_INET , AF_INET6 , AF_UNIX

type:SOCK_STREAM (TCP), SOCK_DGRAM(UDP)

protocol: 0   自动匹配合适协议

成功:返回新套接字所对应的文件描述符

失败:-1  errno

2.6bind函数

bind:给socket绑定IP+端口号

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd:socket 函数返回值

addr:strcut   sockaddr结构

        struct sockaaar_in aaar ;
        addr.sin_fami1y = AF_INET;

        addr. sin_port = htons(8888);
        addr.sin_addr.s_addr = hton1(INADDR_ANY );

addrlen:sizeof(addr)地址结构的大小

成功:0

失败:-1 error

2.7listen函数

listen:设置同时与服务器建立连接的上限数。(同时进行三次握手的客户端数量)

int listen(int sockfd, int backlog);

sockfd:socket 函数返回值

backlog:上限数值,最大值 128

成功 :0

失败:-1 errno

 2.8accept函数

accept:阻塞等待客户端建立连接,成功的话返回一个与客户端成功连接的socket文件描述符

 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:socket 函数返回值

addr:传输参数,传输成功与服务器建立连接的那个客户端的地址结构(IP+端口号)

addrlen:传入传出,入:addr的大小。出:客户端addr的实际大小;

返回值:

成功:能与服务器进行通信的  socket 对应的文件描述符

失败:-1 error

2.9connect函数

connect:使用现有的socket与服务器建立连接

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:socket 函数返回值

addr:传入参数。地址结构(服务器的地址结构)

addlen:addr长度

成功:0

失败:-1 errno

如果不使用bind绑定客户端地址结构,采用"隐式绑定"

三.TCP协议

3.1TCP通讯时序

 三次握手:
主动发起连接请求端,发送SYN标志位,请求建立连接。携带序号号、数据字节数(0)、滑动窗口大小。
被动接受连接请求端,发送 ACK 标志位,同时携带 SYN 请求标志位。携带序号、确认序号、数据字节数(O)、滑动窗口大小。主动发起连接请求端,发送ACK标志位,应答服务器连接请求。携带确认序号。
四次挥手:
主动关闭连接请求端,发送FIN标志位。被动关闭连接请求端,应答ACK标志位。
                                                                                                                        -----半关闭完成。
被动关闭连接请求端,发送FIN标志位。
主动关闭连接请求端,应答ACK标志位。
                                                                                                                         -----连接全部关闭

更多推荐

Mysql---第七篇

系列文章目录文章目录系列文章目录一、简述MyISAM和InnoDB的区别二、简述mysql中索引类型及对数据库的性能的影响一、简述MyISAM和InnoDB的区别MyISAM:不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作是对整个表加锁;存储表的总行数;一个MYISAM表有三个文件:索引文件、表结构文件、数

不要再滥用可选链运算符(?.)啦!

可选链运算符(?.),大家都很熟悉了,直接看个例子:constresult=obj?.a?.b?.c?.d很简单例子,上面代码?前面的属性如果是空值(null或undefined),则result值是undefined,反之如果都不是空值,则会返回最后一个d属性值。本文不是讲解这种语法的用法,主要是想分析下日常开发中,

指针进阶2(内含库函数qsort的模拟实现)

指针进阶2函数指针数组之前给大家介绍过函数指针的相关知识,下面我们进一步讲解一下指针的相关知识:喜欢的小伙伴可以给追秋点点关注,三连走一波!!!我们学习了函数指针数组之后,那肯定有朋友要问了,这个知识点有点复杂,那该如使用呢?下面我们写一个初级的计算器程序简单说明函数指针数组的用途:下面是计算器的代码:#include

华为云HECS云服务器docker环境下安装mysql

华为云HECS云服务器,已经安装了docker环境,准备下docker环境下安装mysql。一、HECS云服务器安装docker登录华为HECS云服务器,安装docker环境。安装docker参考如下文章:华为云HECS安装docker并安装mysql-CSDN博客二、拉取mysql镜像1、拉取mysql5.7的镜像d

Flink1.14 Source概念入门讲解与源码解析

目录FlinkSource概念SourceSource源码getBoundedness()createReader(SourceReaderContextreaderContext)createEnumerator(SplitEnumeratorContextenumContext)SplitEnumeratorres

Redis的高性能之谜

介绍Redis通常用作缓存。当一致性要求不高时,它也可以用作存储。此外,Redis还提供消息订阅、事务、索引等功能。我们还可以使用集群功能构建分布式存储服务,并实现非强一致性的分布式锁服务。在上述各种情况下,Redis都具有一个共同的优势,即处理速度快(高性能)。Redis有多快?要了解Redis有多快,您需要有一个评

MySQL数据库入门到精通3--进阶篇(存储引擎,索引)

1.存储引擎1.1MySQL体系结构1).连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接

怎样使用 NFTScan Solana API 快速创建 NFT 应用程序?

之前,Solana凭借其超高的性能和低廉的费用,已然成为NFT项目最青睐的公链之一,众多知名NFT项目如DeGods、OkayBears、DegenerateApeAcademy等都选择在Solana上发行。意味着Solana链上每天都会产生海量的NFT交易数据,仅交易记录就超过了数百万条。不仅如此,Solana新建钱

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

【C++】STL之适配器---用deque实现栈和队列

目录前言一、deque1、deque的原理介绍2、deque的底层结构3、deque的迭代器4、deque的优缺点4.1、优点4.2、缺点二、stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现三、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现前

Python:为何成为当下最热门的编程语言?

文章目录🍋引言🍋1.简单易学🍋2.多领域应用🍋3.强大的社区支持🍋4.丰富的库和框架🍋5.跨平台兼容🍋6.开源和免费🍋7.数据科学和人工智能的崛起🍋8.自动化和脚本编写🍋9.大型组织的采用🍋10.教育和培训🍋引言在计算机编程的世界里,有数以百计的编程语言可供选择。然而,近年来,Python已经崭

热文推荐