如何实现网络数据传输

news2024/12/28 4:04:11

目录

前言

1.理解源IP地址和目的IP地址

2.理解端口号

2.1端口号与进程pid的关系

2.2源端口号和目的端口号

3.协议

3.1TCP协议

3.2认识UDP协议

4.网络字节序

5.socket编程接口

总结


前言

        在上一篇文章网络框架中给大家对网络的整体进行了一个宏观的介绍,这篇文章中我们进一步来看看两台主机是如何实现网络数据通信的。

1.理解源IP地址和目的IP地址

        在实现不同主机通信的时候首先需要知道对方的IP地址,就如同是唐僧从东土大唐向西天取经,东土大唐可以理解为是源IP地址,而西天可以理解为是目的IP地址,每一台主机实现数据通信的前提是需要有IP地址。

如何查看自己主机上的IP地址:ifconfig

2.理解端口号

        当我们有了对方的IP地址之后,经过中间的不断路由此时到达了对方的主机,但这样就能够实现数据通信了吗?答案是数据到达对方的主机只是完成了第一步,并没有真正完成数据通信,就如同是唐僧到达西天并没有取到经,要想真正取到经是要去大雷音寺的,所以数据到达主机之后,真正通信的是主机上的进程,所以如果找到主机上的进程呢?

为了标识进程的唯一性,在网络通信中提出了端口号的概念,用端口号唯一找到一个进程。此时,有了IP地址加上端口号,就可以在全网上标识一个唯一的进程了,进而在网络数据通信的时候就可以准确的实现数据传输了。

2.1端口号与进程pid的关系

        端口号的是一个2字节16位的整数,标识主机上的一个进程,此时可能会有细心的小伙伴会想,既然端口号是唯一的标识主机上的一个进程,那进程的pid不就是唯一标识一个进程的吗?为什么还要引入端口号呢?为什么不直接复用pid呢?

        答案是在技术上这种方案是可以的,但是引入端口号的原因是也是考虑了以下几个原因:

a.为了网络与系统解耦

b.一般服务器的端口号是不能轻易改变的,进程在退出后,重启再次启动该进程,进程的pid就发送改变了

c.不是所有的进程都会进行网络服务和请求,但是所有的进程都需要有pid

底层操作系统是如何根据port找到找到对应的进程?

操作系统为port维护了一个hash表作为key值,而value是进程PCB

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

2.2源端口号和目的端口号

        在理解了端口号之后,所谓的源端口号就是数据是发送方主机的哪一个进程发的,而目的端口号就是接受方主机的哪一个进程。

3.协议

        在上一篇文章中我们介绍了实现网络数据通信必须要遵守协议约定,在今天对协议可以进一步明确,有了IP地址和port端口号,为实现数据通信提供了技术支持,那在实现双方通信的时候需要告诉对方自己的IP地址和port端口号呢?答案是显然需要的,那如何告知对方呢?

就需要使用协议了,在发送数据的时候协议报头中填充对应的IP地址和port端口号这些字段。

在这里我们主要介绍两种协议,一种是TCP协议,一种是UDP协议。

3.1TCP协议

此处先对TCP(传输控制协议)有一个直观的认识; 后面我们再详细介绍。

传输层协议
有连接
可靠传输
面向字节流

3.2认识UDP协议

此处我们也是对UDP(用户数据报协议)有一个直观的认识; 后面再详细讨论.

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

注:关于TCP协议和UDP协议的具体细节在后面进行介绍,看完上面的简单介绍,相信大家有一个直观的认识TCP是可靠传输而UDP是不可靠传输,可能好奇的小伙伴就会问,既然是不可靠传输,那为什么还保留呢?用可靠传输不是更好吗?

答案是关于可靠和不可靠在网络这里是一种中性词,不是说可靠就一定好,而不可靠就一定不好关于可靠和不可靠是根据不同的场景决定的。可靠的实现是有一定成本的,在维护和编码上是比较复杂的,而不可靠就意味着在维护和编码上更加简单。在网络数据传输的过程中不允许出现数据丢失的情况此时就可以采用TCP协议,但是在数据传输的过程中允许有一些报文丢失,就可以使用UDP

4.网络字节序

        有了上面的技术支持,我们就可以实现双方数据通信了,接下来就需要考虑数据在具体发送时的一些问题,前面我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

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

 使用说明:

h表示host,n表示network,l表示32位长整数,s表示16位短整数。
htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

5.socket编程接口

        作为程序员,实现网络数据通信我们只需要关心应用层的开发,关于传输层和网络层是由OS帮我们维护的,既然底层是由OS系统维护的,我们必然要调用操作系统为我们提高的接口,下面我们就来一起认识一下网络编程中所使用的接口

// 创建 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);

关于每个接口的具体参数我们在后面编码的时候再进行介绍,在这里我们主要介绍一下struct sockaddr*,很明显这是一个结构体,那这个结构体具体是什么呢?

关于socket编程主要分为三类

a.网络套接字编程

b.原始套接字

c.unix域间套接字

第一种可以实现跨主机和本地通信

第二种可以可以直接绕过传输层和网络层,直接访问数据链路层,主要是用于抓包工具的实现

第三种是实现本地通信

关于这三种方式在后续中主要介绍网络套接字编程。此处虽然有三种通信方式,但是显然在上面我们只介绍了一套接口,那他们都适用吗?答案是适用,那是如何做到的呢?

在使用的时候传递不同的结构体,初始时为struct sockaddr,如果是网络套接字编程就强转为struct sockaddr_in,如果是unix域间套接字就强转为sockadd_un

如图所示:

总结

        有了上面知识之后,接下来我们就可以编码完成实现不同主机数据通信,关于如何编码完成,将在下一篇文章中为大家介绍。

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

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

相关文章

理解递归方法

递归相关问题 树和二叉树相关的大部分问题二分查找相关问题快速排序、归并排序相关问题所有回溯的问题所有动态规划的问题 本质与特征 本质 本质就是方法的调用,而且是方法自己调用自己。 特征 执行时范围不断缩小,这样才能触底反弹终止(结…

使用MIT Kerberos Ticket Manager在windows下浏览器访问hadoop页面

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置说明安装Firefox浏览器安装MIT Kerberos Ticket Manager客户端配置krb5.ini文件配置MIT Kerberos Ticket Manager客户端配置Firefox浏览器代理参数 访问WebUI 前言 kerberos是一种计算机…

亚马逊关键词下单的作用

在亚马逊上,关键词对于商品的搜索和发现起着非常重要的作用。当卖家在亚马逊上发布商品时,他们可以使用相关的关键词来描述该商品,这些关键词通常是与该商品相关的词汇或短语。 关键词下单的作用如下: 1、商品搜索: 买…

vue3+antd——实现个人中心页面+同步更改头部用户信息——基础积累

之前写过一篇文章关于vue3antd的框架模板,链接如下:http://t.csdn.cn/9dZMS 首先感谢大神提供的后台管理系统的模板,在此基础上改动要简单很多,主要是自己有很多内容不太敢随意改动。。。 直接看【个人中心】页面的效果图&#…

JavaScript事件委托与事件流+牛客例题

事件流: 概念:事件完整执行过程中的流动路径 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父 注意&…

TEMU美国儿童文具亚马逊CPC测试标准

美国站儿童文具类上架跨境电商平台美国站或者出口美国需要提交CPC认证,才能进入美国市场,由CPSC 认可的实验室出具的检测报告,确认每件商品均已过检测,符合上述适用要求。但许多亚马逊卖家反映:在亚马逊卖的文具类产品…

哪个思维导图软件好,知道这5个就够了!

思维导图作为一种有效的组织和展示思维的工具,广泛应用于学习、项目管理、创意发展等领域。然而,手工绘制思维导图费时费力,限制了其在快节奏的现代生活中的应用。本文将介绍5款可以一键生成思维导图的软件,它将通过智能化的方式&…

Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题

我们在使用浏览器访问各个网站时,经常会保存密码。在下一次访问时,直接使用保存的密码填充,简单方便。 但是突然有一天(怀疑是谷歌浏览器更新导致的),每次使用密码填充时,都有如下拦截 拦截提…

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…

PyTorch中ReduceLROnPlateau的学习率调整优化器

PyTorch中ReduceLROnPlateau的学习率调整优化器 作者:安静到无声 个人主页 简介: 在深度学习中,学习率是一个重要的超参数,影响模型的收敛速度和性能。为了自动调整学习率,PyTorch提供了ReduceLROnPlateau优化器&…

Linux IPIP隧道连通两个局域网

拓扑结构 现有两台主机,它们具有两个网口分别接入到不同网络中。 主机A: eth0:处于 10.0.1.2/24 网段eth1: 处于192.168.1.100/24 网段 主机B: eth0:处于10.0.2.3/24 网段eth1: 处于192.168.2…

持续同步的实时备份软件推荐!

什么是实时备份? 实时备份是一种持续数据保护方法,通过缩短自动保存文件的时间间隔,可以备份每个更改的副本,以捕获保存数据的每个版本。 传统备份方式只能将数据还原到备份完成时的状态,如果在故障发生时进行恢复…

收藏!!!一起来学习IGBT基础知识。

1 IGBT是什么? IGBT,绝缘栅双极型晶体管,是由(BJT)双极型三极管和绝缘栅型场效应管(MOS)组成的复合全控型电压驱动式功率半导体器件, 兼有(MOSFET)金氧半场效晶体管的高…

init_pg_dir 的大小及作用

init_pg_dir 的大小 vmlinux.lds.S 中 在vmlinux.lds.S 中,有 init_pg_dir .; . INIT_DIR_SIZE; init_pg_end .;/*include/asm/kernel-pgtable.h*/ #define EARLY_ENTRIES(vstart, vend, shift) \ ((((vend) - 1) >&g…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动该地区金融平等

流支付正在成为一种全新的支付形态,Zebec Protocol作为流支付的主要推崇者,正在积极的推动该支付方案向更广泛的应用场景拓展。目前,Zebec Protocol成功的将流支付应用在薪酬支付领域,并通过收购WageLink将其纳入旗下,…

3.7v升压5v4A芯片用什么型号

问:我需要一个能够将3.7V锂电池的电压升压到5V,并且能够提供4A的电流输出的芯片。请问有什么推荐的型号吗? 答:小编为您推荐AH6922B芯片,它具备以下特点来满足您的需求: 1. 输入电压范围适配:…

SAP 计划独立需求屏幕增强(MD61/MD62/MD63)

需求:在计划独立需求界面新增一列自定义字段 效果如下: MD63:显示:(注:客户字段在显示界面不可以编辑) MD61:创建/MD62:修改(注:创建和修改的时候客户字段可…

C语言学习笔记 vscode使用外部console-11

前言 在默认情况下,我们运行C语言程序都是在vscode终端的,在小程序运行时这个是没有问题的,但是当程序变得复杂它就不好用了,这时我们可以将这个终端设置为外部console,这样方便处理更多、更复杂的程序。 步骤 1.点击…

4基础篇:自定义日志

前言 在所有的后端服务中,日志是必不可少的一个关键环节,毕竟日常中我们不可能随时盯着控制台,问题的出现也会有随机性、不可预见性。一旦出现问题,要追踪错误以及解决,需要知道错误发生的原因、时间等细节信息。 之前的需求分析部分,在网关基础代理的服务中,网关作为…

局域网内共享打印机遇到的一些问题

局域网内共享打印机遇到的一些问题 常规共享步骤主机关机后开机,打印机用不起了报错:没有权限使用报错:Windows无法连接到打印机报错:0x0000011b报错:0x00000709 常规共享步骤 win7作为主机使用USB连接打印机&#xf…