网络的基本概念和socket编程

网络的基本概念

  • 1.协议
    • 1.1 协议的基本概念
    • 1.2 常见的协议
  • 2.分层模型
      • 2.1网络七层OSI 7层模型:物数网传会表应(口诀)
      • 2.2TCP/IP模型
      • 2.3数据通信的过程
      • 2.4网络的设计模式
      • 2.5以太网帧的格式
  • 3.SOCKET编程
    • 3.1网络字节序
    • 3.2 相关结构体和函数
    • 3.3 代码实现

1.协议

1.1 协议的基本概念

协议:双方共同指定的一组规则,在网络通信中指通信双方传递数据和通信双方传递数据和解释数据的一组规则。

1.2 常见的协议

  1. TCP/IP协议:传输控制协议/互联网协议是互联网通信的基础协议。它将数据分割成小的数据包进行传输,并通过IP地址定位目标设备。

  2. HTTP协议:超文本传输协议是用于在网络中传输超文本的应用层协议。它用于在Web浏览器和Web服务器之间传输HTML页面。

  3. FTP协议:文件传输协议是用于在网络中传输文件的协议。它允许用户在客户端和服务器之间进行文件的上传和下载。

  4. SMTP协议:简单邮件传输协议是用于在网络中传输电子邮件的协议。它定义了如何发送和接收电子邮件。

  5. DHCP协议:动态主机配置协议是用于在一个网络中自动分配IP地址的协议。它允许设备动态获取IP地址、子网掩码、网关等网络配置信息。

  6. DNS协议:域名系统是将域名解析为IP地址的协议。它通过将用户输入的域名转换为IP地址,使得计算机能够找到目标服务器。

  7. Telnet协议:用于在网络上远程登录到其他计算机进行操作和管理。

  8. SSH协议:和Telnet相似,但是提供了更加安全的远程登录方式。

  9. .SSL/TLS协议:用于在网络上进行安全的通信,提供数据加密和认证功能,常用于安全的网页浏览、电子商务等。

这些协议在网络通信、电子邮件、安全通信和文件传输等方面起到了重要的作用。

2.分层模型

2.1网络七层OSI 7层模型:物数网传会表应(口诀)

应用层:为客户提供各种应用服务,email服务,ftp服务,ssh服务。
表示层:编解码,翻译工作。
会话层:通过传输层建立数据传输的通道,建立,维护,终止会话。
传输层:传输数据,TCP,UDP协议,端对端传输。
网络层:定义了网络,两台机器之间的传输路径选择点对点传输。
数据链路层(网络接口层):数据校验,定义了网络传输的基本单位–帧。
物理层:双绞线,光纤(传输介质),将模拟信号信号转化为数字信号。

在这里插入图片描述

2.2TCP/IP模型

在这里插入图片描述

2.3数据通信的过程

在这里插入图片描述
在数据发送方是一个层层打包的过程,数据接收方是一个层层解包的过程。

2.4网络的设计模式

网络的设计模式,有B/S模式和C/S模式。

C/S模式:

客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任务分配到Client和Server两端,降低了系统的通讯开销。C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用

硬件环境要求:C/S 用户固定,一般只应用于局域网中,要求拥有相同的操作系统,如果对于不同操作系统还要相应开发不同的版本,并且对于计算机电脑配置要求也较高。

B/S模式:
浏览器----服务器结构,是目前应用系统的发展方向。BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区别于传统的C/S模式,特意称为B/S模式。在这种结构下,通过W3浏览器来进入工作界面,极少部分事务逻辑在前端(Browser)实现,主要事务逻辑在服务器端(Server)实现,形成三层(3-tier)结构。这样使得客户端电脑负荷大大简化(因此被称为瘦客户端),减轻了系统维护、升级的支出成本,降低了用户的总体成本(TCO)。

硬件环境要求:要求有操作系统和浏览器就行,与操作系统平台无关(可以实现跨平台),对客户端的计算机电脑配置要求较低。

2.5以太网帧的格式

在这里插入图片描述这里的目的地址和源地址都是指MAC地址,MAC地址为6个字节,IP地址为4个字节,不同类型对应了不同的值,CRC是进行校验的。

下面我们我们来以ARP请求包,假如我们有狠多的机器,我们想给其中一个机器建立对话,我们不知道它的MAC地址只知道IP地址,那么我们如何建立会话呢?
在这里插入图片描述现在我们来看看以太网帧,以ARP为例。

这里是ARP请求包,不知道的mac地址我们填ff:ff:ff:ff:ff:ff。

在这里插入图片描述

如果这个IP地址和自己一样,给A机器发一个ARP应答包。

在这里插入图片描述

3.SOCKET编程

3.1网络字节序

socket编程之前,我们要知道大端字节序和小端字节序是什么意思

1.大端字节序(Big-Endian):在这种模式下,数据的高位字节保存在内存的低地址中,而数据的低位字节保存在内存的高地址中。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。大端字节序在网络传输和文件储存中较为常见。
2.小端字节序(Little-Endian):在这种模式下,数据的低位字节保存在内存的低地址中,而数据的高位字节保存在内存的高地址中。小端字节序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。

如何知道我们的程序是大端字节序还是小端字节序呢?可以通过下面这个代码

#include <stdio.h>
union{char byte[4];int num;
}test;int main()
{test.num=0x12345678;if(test.byte[0]==0x78)printf("小端\n");else if(test.byte[0]==0x12)printf("大端\n");elseprintf("error");printf("[0]:%p:0x%X\n""[1]:%p:0x%X\n""[2]:%p:0x%X\n""[3]:%p:0x%X\n",&test.byte[0], test.byte[0],&test.byte[1], test.byte[1],&test.byte[2], test.byte[2],&test.byte[3], test.byte[3]);
return 0;
}

我们在网络传输的时候用的是网络字节序,也就是大端字节序,进行网络通信时要把地址转化为大端字节序,下面是相关函数。

在这里插入图片描述
把点分十进制转化为大端字节序IP
在这里插入图片描述
把大端字节序IP转化为点分十进制IP
在这里插入图片描述

3.2 相关结构体和函数

常用的结构体sockaddr,我们一般用第二个结构体,方便我们赋值
在这里插入图片描述
这是我们用的socket函数

在这里插入图片描述
下面是它的参数说明在这里插入图片描述
成功以后会返回文件描述符

在这里插入图片描述
然后就是bind函数,用来给客户端和服务器端建立联系。

在这里插入图片描述
下面把客户端由注动变为监听状态(客户端主动连接服务器)

在这里插入图片描述

得到一个连接,进行客户端和服务端之间的通信

在这里插入图片描述
这里我们就用知道,accept是一个阻塞函数,它要从已连接队列中拿一个可用的连接过来。调用accept之前连接可能就已经建立了。

现在就可以连接服务器了,用connect函数

在这里插入图片描述

3.3 代码实现

服务端的开发

#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>int main()
{//创建socket//int socket(int domain, int type, int protocol);int lfd = socket(AF_INET, SOCK_STREAM, 0);if(lfd<0){perror("socket error");return -1;}//int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//绑定struct sockaddr_in serv;bzero(&serv, sizeof(serv));serv.sin_family = AF_INET;serv.sin_port = htons(8888);serv.sin_addr.s_addr = htonl(INADDR_ANY); //表示使用本地任意可用IPint ret = bind(lfd, (struct sockaddr *)&serv, sizeof(serv));if(ret<0){perror("bind error");	return -1;}//监听//int listen(int sockfd, int backlog);listen(lfd, 128);//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);struct sockaddr_in client;socklen_t len = sizeof(client);int cfd = accept(lfd, (struct sockaddr *)&client, &len);  //len是一个输入输出参数//const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//获取client端的IP和端口char sIP[16];memset(sIP, 0x00, sizeof(sIP));printf("client-->IP:[%s],PORT:[%d]\n", inet_ntop(AF_INET, &client.sin_addr.s_addr, sIP, sizeof(sIP)), ntohs(client.sin_port));printf("lfd==[%d], cfd==[%d]\n", lfd, cfd);int i = 0;int n = 0;char buf[1024];while(1){//读数据memset(buf, 0x00, sizeof(buf));n = read(cfd, buf, sizeof(buf));if(n<=0){printf("read error or client close, n==[%d]\n", n);break;}printf("n==[%d], buf==[%s]\n", n, buf);	for(i=0; i<n; i++){buf[i] = toupper(buf[i]);}//发送数据write(cfd, buf, n);}//关闭监听文件描述符和通信文件描述符close(lfd);close(cfd);return 0;
}

客户端的开发

//客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main()
{//创建socket---用于和服务端进行通信int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd<0){perror("socket error");return -1;}//连接服务端//int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);struct sockaddr_in serv;serv.sin_family = AF_INET;serv.sin_port = htons(8888);inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);printf("[%x]\n", serv.sin_addr.s_addr);int ret = connect(cfd, (struct sockaddr *)&serv, sizeof(serv));if(ret<0){perror("connect error");return -1;}	int n = 0;char buf[256];while(1){//读标准输入数据memset(buf, 0x00, sizeof(buf));n = read(STDIN_FILENO, buf, sizeof(buf));//发送数据write(cfd, buf, n);//读服务端发来的数据memset(buf, 0x00, sizeof(buf));n = read(cfd, buf, sizeof(buf));if(n<=0){printf("read error or server closed, n==[%d]\n", n);break;}printf("n==[%d], buf==[%s]\n", n, buf);}//关闭套接字cfdclose(cfd);return 0;
}

最后留下一个过程图
在这里插入图片描述

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

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

相关文章

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由

NAS如何成为生产力&#xff1f;使用绿联DX4600 Pro搭建图床并实现创作自由 哈喽小伙伴们好&#xff0c;我是Stark-C~ 关注我的小伙伴都知道&#xff0c;我之前有分享过我的创作过程与工具&#xff0c;其中介绍了我个人其实一直都是使用Markdown的编辑器来进行图文创作的。 我…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Web组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Web组件 提供具有网页显示能力的Web组件&#xff0c;ohos.web.webview提供web控制能…

《剑指 Offer》专项突破版 - 面试题 38、39 和 40 : 通过三道面试题详解单调栈(C++ 实现)

目录 面试题 38 : 每日温度 面试题 39 : 直方图最大矩形面积 方法一、暴力求解 方法二、递归求解 方法三、单调栈法 面试题 40 : 矩阵中的最大矩形 面试题 38 : 每日温度 题目&#xff1a; 输入一个数组&#xff0c;它的每个数字是某天的温度。请计算每天需要等几天才会…

AJAX——认识URL

1 什么是URL&#xff1f; 统一资源定位符&#xff08;英语&#xff1a;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff0c;或称统一资源定位器、定位地址、URL地址&#xff09;俗称网页地址&#xff0c;简称网址&#xff0c;是因特网上标准的资源的地址&…

生于越南,“开源改变了我的人生!”

注&#xff1a;本文精选自《新程序员 007&#xff1a;大模型时代的开发者》&#xff0c;欢迎点击订购。 作者 | 王启隆 责编 | 唐小引 出品 | 《新程序员》编辑部 随着人工智能浪潮的席卷&#xff0c;开源不再仅仅是计算机领域的一个话题&#xff0c;而是成为推动技术创新…

【动态规划】【回文】【字符串】1278分割回文串 III

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode1278分割回文串 III 给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改…

【Linux系统 04】OpenEuler配置

目录 一、镜像文件下载 二、配置静态IP 三、启动SSH连接 四、远程免密登录 五、安装常用软件 一、镜像文件下载 官方下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 选择一个版本&#xff0c;lopenEuler通常有两种版本&#xff1a; 创新版&…

Java 内存区域介绍

&#xff08;1&#xff09;程序计数器 程序计数器主要有两个作用&#xff1a; 字节码解释器通过改变程序计数器来依次读取指令&#xff0c;从而实现代码的流程控制&#xff0c;如&#xff1a;顺序执行、选择、循环、异常处理。 在多线程的情况下&#xff0c;程序计数器用于记录…

C++笔记之regex(正则表达式)

C++笔记之regex(正则表达式) ——2024-02-10 ——《C++标准库》(第2版,侯捷译) Page 717 code review! 文章目录 C++笔记之regex(正则表达式)例1:使用正则表达式进行搜索(`std::regex_search`)例2:使用正则表达式进行全文匹配(`std::regex_match`)例3:使用正则表达式…

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…

【九章斩题录】Leetcode:判定是否互为字符重排(C/C++)

面试题 01.02. 判定是否互为字符重排 ✅ 模板&#xff1a;C class Solution { public:bool CheckPermutation(string s1, string s2) {} }; 「 法一 」排序 &#x1f4a1; 思路&#xff1a;看到题目中说 "重新排列后能否变成另一个字符串"&#xff0c;等等……重新…

读千脑智能笔记10_人类智能存在的风险

1. 人类智能存在的风险 1.1. “末日时钟” 1.1.1. 核战争引发的大火列为地球毁灭的主要原因 1.1.2. 气候变化列为人类自我毁灭的第二大潜在原因 1.2. 除非我们刻意加入自私的驱动力、动机或情感&#xff0c;否则智能机器并不会威胁到人类的生存 1.2.1. 人类在不远的将来会…

系统架构21 - 统一建模语言UML(下)

UML图 UML中的图分类作用 视图用例视图逻辑视图进程视图实现视图部署视图 UML中的图 “图”是一组元素的图形表示&#xff0c;大多数情况下把图画成顶点&#xff08;代表事物&#xff09;和弧&#xff08;代表关系&#xff09;的连通图。为了对系统进行可视化&#xff0c;可以…

【经验】PIC16F877A串口发送字符串问题

PIC16F877A串口发送&#xff0c;查询方式&#xff0c;就为了调出这个费了我一天时间&#xff0c;原来是串口芯片电压问题&#xff0c;现总结如下&#xff1a; 1、注意232串口芯片供电电压&#xff0c;有5V和3.3V的 2、注意TXD、RXD接线&#xff0c;单片机的TXD接232芯片的R2O…

Linux中孤儿/僵尸进程/wait/waitpid函数

孤儿进程&#xff1a; 概念&#xff1a;若子进程的父进程已经死掉&#xff0c;而子进程还存活着&#xff0c;这个进程就成了孤儿进程。 为了保证每个进程都有一个父进程&#xff0c;孤儿进程会被init进程领养&#xff0c;init进程成为了孤儿进程的养父进程&#xff0c;当孤儿…

【计算机网络】时延,丢包,吞吐量(分组交换网络

时延 结点处理时延(nodal processing delay&#xff09; dproc 排队时延&#xff08;queuing delay&#xff09; dqueue 传输时延&#xff08;transmission delay&#xff09; dtrans 路由器将分组推出所需要的时间&#xff0c;是分组长度和链路传输速率的函数 传播时…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

酷开科技荣获消费者服务平台黑猫投诉“消费者服务之星”称号

什么是优质服务&#xff1f;既是以客户为中心的庄严承诺&#xff0c;又是对服务能力提升的深耕细作&#xff1b;既是对服务标准的敬畏&#xff0c;也是对服务创新的不断探索……服务是多维的&#xff0c;每个企业都有自己独到的诠释&#xff0c;或事无巨细环环严控&#xff0c;…

什么是CDR数字音频广播

一、什么是数字音频广播 CDR(China DigilalRadio)&#xff0c;即中国数字音领广播&#xff0c;是运用广播数字化技术&#xff0c;通过对音领信号进行信源编码、信道编码和载波调制传输&#xff0c;来实现数字音频广播业务和数据业务的播出。CDR与传统的FM调频广播相比&#xff…