网络编程基础

2023-11-15

目录

一、网络的概念

1.认识网络

2.网络的发展

二、协议

1.网络问题的产生

2.什么是协议

3.网络协议

三、协议分层

1.协议分层的概念

2.OSI七层模型

3.TCP/IP四层(五层)模型

(1)物理层

(2)数据链路层(网卡层)

(3)网络层

(4)传输层

(5)应用层

四、局域网络通信

1.协议报头

2.MAC地址

3.局域网通信原理

4.局域网通信的过程

5.一些局域网的介绍

五、跨网络通信

1.IP协议的作用

2.IP地址与MAC地址

3.跨网络通信的大致流程


一、网络的概念

我们每天都需要上网,在你看博客的时候就正在使用互联网。

那网络这个我们既熟悉又陌生的东西到底是什么呢?

1.认识网络

在我们的印象中网络应当是计算机间沟通的东西,其实计算机本身就是一种小型的网络结构。

在计算机的内部存在许多模块,比如CPU,显卡,磁盘,网卡等硬件资源。这些模块只有协同工作,才能保证一台计算机正常运行。

而为了保证模块之间的协调运作,模块间必定存在信息的传送。在计算机中有很多的线(物理上的电线之类的),信息就是通过各模块之间的线传送的。

这些实际存在的线与被连接的硬件模块构成了一个网状结构,这种结构就被叫做网络。

那么我们不妨将视野放大一点,我们假设连接硬件设备的线可以无限远。如果我们移除一台计算机的硬盘,再准备一些储存能力很强的计算机与该计算机连接起来,这些专门用于存储的计算机也可以叫做存储集群。

所以当该计算机需要存储数据时,就可以直接通过线向数据传送到存储集群,需要用到硬盘数据时,也可以通过线获取数据。

那如果我们将计算机的各个硬件全部分散开来,并通过线连接起来,它们也就构成了一个网络,但所有的设备还是一台计算机。只要我们的网络传输够快,所有的硬件都可以单独设置一个集群,集群间通过网络传送数据,这也是很多大型计算机的实现思路。

所以最终我们认识到:计算机体系结构中有网络,网络中也有计算机的体系结构。

2.网络的发展

(1)在网络发展的早期计算机间处于独立模式,也就是计算机之间会保持相互独立。

比如说下面的三台计算机,由于它们之间相互独立,所以只能自己干自己的事情。小松、小竹、小梅想要获取对方的数据就必须使用硬盘等存储介质进行转移,很不方便。

那我们如果再拿一台计算机作为服务器并将其与三个人的电脑连接起来,三个人处理好数据就可以发送到服务器上,三个人需要数据也可以从服务器中拿。

(2)网络继续发展,实现了网络互连,小范围内的多个计算机可以共享数据。

(3)后来,想要共享数据的计算机数量变得更多了,大家都有数据交换的需求。这些计算机就会通过交换机和路由器彼此连接起来,此时就构成了一个局域网(LAN)。

接入局域网的计算机之间可以之间传送数据。

(4)再后来,全世界的局域网越来越多,人们也不再满足于局域网的一定地域范围的计算机间通信,此时就出现了能将各个局域网互相连接的广域网(WAN)。

如图所示,将每个城市的局域网通过路由器相连,这样就形成了一个大的“局域网”,我们就称之为广域网。

广域网实现了局域网间的数据传送,远隔千里的计算机此时也能连接在一起了。比如说,从天津到上海开车需要走1000多公里,但通过广域网,天津和上海的计算机就可以进行数据传输。

“局域网”和“广域网”只是一个相对的概念。你可以将一个国家的单个城市不同地区局域网组成的广域网,看做是这个国家的局域网。而不同国家的广域网,又可以看作全球通信的局域网。

注意,上面我们说路由器就可以连接起各个局域网,但是实际广域网的连接方式是很复杂的,这种网络的构建者是各大通信运营商,在中国就是中国移动、中国联通和中国电信。通信运行商在中间起到的作用我们以后会说到。

二、协议

1.网络问题的产生

我们人与人之间面对面沟通的时候,通过语言或者面部表情等都能很快理解到对方的信息,也就是说短距离沟通的障碍是很小的。

如果二人隔了很远的距离说话,一方面,你说话的时候对方可能听不清,也可能对方没听清一部分,而且你也很难知道对方到底听懂没听懂。而对于网络而言,更多的都是长距离的数据传输,所以网络传输一方面障碍很多,另一方面,可能引入新的问题(比如面对面对方一个眼神你就知道对方听懂没听懂了,而远距离你甚至都看不到对方,这就是引入新的问题)。

所以我们得到以下结论:所有的网络问题本质都是通信距离变长导致的。

2.什么是协议

其实在我们的生活中就有协议,比如说我跟同学约好了去水上公园玩,我告诉他,只要我给你打电话了,你下楼来找我就可以了。

在这里,虽然我打电话只是一个行为,但是我们二人早就商量好了,只要我打电话他就下楼,这是我们之间不需要解释共识。

所以,协议的本质就是约定。

在计算机中也是一样,比如说两台计算机进行通信。两台计算机约定好,其中一台计算机给另一台计算机发送一个整形数字,每个整形数字代表的操作不同。

比如 ,一台计算机给另一台计算机发送整型数字1,而数字1代表重启电脑,那另一台计算机收到数字1后就会直接重新启动。

有了这样的协议就减少了计算机通信的阻碍。

3.网络协议

在计算机制造中,计算机生产厂商有很多,生产计算机硬件的厂商更多,生产网络传输相关硬件的厂商也很多。每一个厂商都有自己的协议,每一种硬件支持的协议都不一样。到最后,不同协议间的硬件无法有效传输信息,大家的计算机还是不能通信。

既然这样,就必须出现一个统一的标准,大家根据一样的标准才能通信,现在这样的标准就叫做网络协议。

三、协议分层

1.协议分层的概念

协议实质上还是计算机的软件部分,因为协议的使用必须依靠一定的数据结构。

那协议分层又从何谈起呢?我们以打电话为例。

如上图所示,两个人通过座机打电话,当电话打通时:

  • A先对着电话说话,电话将A的语音信息采集到。
  • 座机再将采集到的信息传给C的电话。
  • C的座机再将从A的电话传过来的信息放给C听。

对于A和C来说,他们都认为自己在直接与对方通话。

对于两台电话机来说,它们也认为是它们之间在互相传递信息。

这样一来,整个通话的信息传递就分为了两层:

  • 语言层,A和C交流。
  • 通信设备层,A的电话机和C的电话机交流。

两层每层都有各自的协议:

  • 语言层,A和C使用汉语交流。
  • 通信设备层,A的电话机和C的电话机使用电话机协议交流。

如果A和C使用英语交流,只是语言层的协议从汉语变成了英语,电话机协议不需要改变,两人同样可以正常通话。

如果A和C使用无线电来通话,此时仅是通信设备层的协议从电话机协议变成了无线电协议,语言层仍然使用汉语协议。

也就是说,两层中的某一层协议发生改变时,不影响另一层。

在实际的网络通信中,分的层数会更多,情况也更复杂,但同样符合这一特点。

那这样的分层有什么优势呢?

  • 低耦合,某一层发生变化并不影响其他层。
  • 高内聚,功能比较集中,耦合度比较高的模块都会分在同一层。

协议分层的一个重大原因就是,每一层都需要解决特定的问题,这些问题主要表现为以下四点:

(1)如何把数据交付给和自己直接相连的下一台主机。

比如,我要从太原开车去天津,我第一站肯定是先去阳泉,我如果开到阳泉的能力都没有,那又何谈去天津呢?

(2)要有路径选择的能力,因为网络通信过程中存在很多节点。

太原到天津如果我们东南西北分不清,也没有导航。那我们走着走着就不知道自己到哪了,所以网络通信必须也要有选择到达最终接收机器路径的能力。

(3)容错纠错的能力,当通信信息发送错误时,能够处理。

我想从太原到天津,应该向东北方向走。如果我走着走着突然发现自己到西安了,那我就知道我往西南方向走了,需要折回去。网络通信也是一样,比如说发送的数据送错位置了,下一台主机没有收到(很像加速器上说的丢包),那就需要重新发送一份数据,这就是一种纠错能力。

(4)当信息递达以后,具体的应用问题。

我到天津之后,我总要干一些具体的事情,比如我是回家,还是海河边遛遛弯之类的。网络通信也是一样,数据到了目标主机上,目标主机总是要用这些数据做事情的,传输数据只是手段,解决问题才是目的。

2.OSI七层模型

OSI(Open System Interconnection,开放系统互连)模型将网络通信分为七层,它也叫开放式系统互联参考模型,是一个网络通信逻辑上的定义和规范。

  • 物理层:标识一些硬件规定,比如高电压表示1,低电压表示0。
  • 数据链路层:负责将数据传输到与该设备直接相连的下一台主机。
  • 网络层:确定数据传输的路径选择。
  • 传输层:如果将路由器和主机都看作一个节点,则网络是图状结构,这一层就负责不直接相联的节点间数据的传输。
  • 会话层、表示层、应用层:由于这部分的代码是程序员自己实现的,所以这三层的协议各不相同。我们常常把这三层直接压成一层。

注意,会话层、表示层、应用层都是各司其职的,我举一个例子。比如说,你在参加社团活动时认识了一个女孩子,你想跟她加微信,她也同意了。

此时,你们之间就建立了联系。建立联系,就是会话层常做的工作。

你们聊天后发现,二人说话都喜欢直截了当,这样你们就确立了两个人的说话风格。确定通信风格,就是表示层的工作。

最后,你们二人开始试着交往,那两个人就可以去电影院、游乐园之类的地方。根据实际进行实际问题操作,就是应用层的工作。

由于这三层的代码是程序员自己实现的,所以根据实现不同,它们的工作协议也会有所变化,上面只是一个简单的例子,不代表全部。

3.TCP/IP四层(五层)模型

TCP/IP模型也遵循OSI规则,它将上三层合并成了一层,叫做应用层。所以还剩下五层,再加上物理层也不会被考虑,最后剩下四层。

在以后的学习中,如果没有特别说明物理层,TCP/IP模型就只有四层。

(1)物理层

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

这里需要说一下集线器,集线器是加强信号的机器。如果我们需要把一条信息从天津送到上海,两地距离1000多公里,数据就需要长距离传输。而信息必须使用一定的物理介质传播,比如光信号等。在传递过程中信息的强度就会逐步减弱,当信号将要衰减至无法识别前,集线器就会将该信号加强,以达到远距离传输的目的。

我们加一个小插曲,大家看没看过家里的光猫和路由器。有没有好奇过,这两个小玩意是怎么帮我们上网的?

实际上,光猫的学名叫做调制解调器。它会与光纤(或网线)进行连接,并通过光纤(或网线)接受和发送信息。

在网络通信中我们有两种常用的信号,一种叫数字信号,一种叫模拟信号。模拟信号类似于波,更适合远距离传播,而数字信号就是我们二进制的01组合,适合小范围局域网内传播。

所以,调制解调器会先从光纤中获取模拟信号信息,然后在其内部将模拟信号转换为数字信号并传输给路由器。

路由器可以构建局域网,它接收数字信号后将数据再发给我们的手机、电脑和电视等设备。

我们发送的数据也可以反方向输送到光纤远距离传输。

还有一点就是什么是双绞线。你可能不知道双绞线是什么,但下面这个插头你一定见过。

这个就是双绞线的水晶头,双绞线跟我们所说的网线没什么区别。比如我们的房间里可能墙上就伸出来这么一个水晶头,将该水晶头插上电脑就能实现上网。

最后一点,网卡也属于物理层,它也可以接收网络传递来的信息。比如说,网卡接收到信息后,就会解析数据并对它的寄存器进行充电,数据的01序列就被放到寄存器里。然后操作系统就能将数据读走使用。

所以说,寄存器只存在于CPU的说法是不对的,实际上硬件还有外设都有自己的寄存器,我们看上去是将数据写到了某个设备上,其实是先写入寄存器,然后再经过硬件处理。所以,这些不同硬件与外设的寄存器也被称作端口。

上面这些知识大部分属于硬件,不在我们学习的范围内,了解即可。

(2)数据链路层(网卡层)

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

我们以后会详细讲述交换机的工作方式,但现在我们只需要记住数据链路层负责将数据传输到与该设备直接相连的下一台主机即可。

(3)网络层

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

我们记住网络层能提供路径选择能力,而且很多以后要学习的传输协议还有路由器都工作在这一层。

(4)传输层

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

我们记住传输层提供纠错能力就可以了。

(5)应用层

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

应用层就是利用发来的数据解决一些实际的问题了,比如说识别出是通知就给用户发过来之类的。

4.TCP/IP四层模型图解

这个图片也很重要,我们还是需要解读它的信息,我们从下往上开始说。

其实这个图是有一些问题的,如果根据我们之前学过的计算机体系层次来看的话。

物理层对应硬件,这里也是唯一属于计算机硬件的一层。

数据链路层(网卡层)对应计算机的硬件驱动,从这里开始向上就全都属于软件了。

传输层和网络层是操作系统自己实现的,不管我们使用的是Windows、Linux还是MacOS,只要计算机能入网,这里的实现就完全一样。

不论是我们的手机、电脑还是其他电子设备,只要入网大部分会在传输层使用TCP协议,在网络层使用IP协议,所以我们管这个模型叫做TCP/IP四层模型。

由于操作系统不相信任何人,所以在传输层和应用层之间会存在系统调用接口。

还记得之前的进程间通信吗?进程间的管道通信本质使用了文件操作,而网络通信实质上就是跨主机的进程间通信。所以,网络接口就被整合进了文件操作里,这样使得学习过系统编程的人学习网络接口的效率会大大提高。

每一个机器都有自己的工作层,对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容。对于一台路由器, 它实现了从网络层到物理层。对于一台交换机, 它实现了从数据链路层到物理层。对于集线器, 它只实现了物理层。

但是现在随着科技的发展,上面的这些机器都已经可以在多个层内工作,比如路由器就已经变成了一台小型计算机,它可以实现更多的操作。所以上面的表述只是教科书的表达,很多机器都已经在多个层内工作。

四、局域网络通信

1.协议报头

大家肯定都有网购的经历,比如说我在网上买了一个保温杯。首先,商家会把现货交给快递公司。快递公司会用盒子包装好并贴上快递单,然后送到离我们最近的快递点。

当我拿到保温杯的时候,它不仅有一个水杯,还会多出来一些东西,比如包装盒和贴着的快递单。理论上我们从驿站取快递时应当打开检查后再将物品拿回,快递盒和快递单不应该被我们拿走,只不过直接拿走更方便更有效率,这一步就被省略了。

快递单上的信息对于我们而言没什么用,但对快递站则是一种协议,这些信息可以帮助快递员转运快件。站在网络的角度,快递单的数据就是协议。

快递单上的信息需要一个快递单来填写并贴在便于运输的纸盒上。站在网络的角度,信息需要空间保存,所以包装盒和快递单就对应了协议报头。

所以,我们能得到以下结论:

  • 每一层都有协议,每一个协议的最终表现就是协议都要有报头。
  • 协议通常是通过协议报头进行表达的
  • 每一份数据最终在被发送或者在不同的协议层中,都要有自己的报头。

2.MAC地址

两台同属一个局域网的设备可以直接通信,比如说我们的手机wifi热点原理也是局域网。那局域网是怎么让设备间进行通信的?为了搞清这个问题,我们首先要认识MAC地址。

我们每一个人都有自己的身份证号,对于网卡也是一样。每个人的身份证号都不一样,同样网卡也需要一个可以标识自己唯一性的名字,这个名字就是MAC地址。在局域网中每台电脑的MAC地址是唯一的。

我们可以通过ifconfig指令查看Linux机器的网络信息。

第五行ether(以太)后面的的52:54:00:9c:e6:65就是MAC地址。

我们也可以点击Windows+r输入cmd,用ipconfig /all指令查看Windows机器网络的所有信息。

其中我链接的是无线局域网,物理地址98-8D-46-55-AC-99就是MAC地址。

每个MAC地址大小为6个字节,48个比特位。

实际上,像硬盘等硬件也有自己的专有的序列号。只不过标识网卡唯一性的MAC地址需要参与网络通信,它太特殊了,所以其他硬件的序列号我们都不关心。

3.局域网通信原理

所有的主机都接入了同一个局域网,所以每一个主机都认为它在与其他主机进行通信。

但是我们不妨想象这样一个场景,在一个班级中有小明、小红、小刚等几十个同学。老师正在前面讲课,讲到一半说:“小明,上来把这个题做一下。”此时,小明就站起来走到黑板前拿粉笔并开始写。

首先,老师讲课,学生听课就可以看作老师向学生传递信息。学生之间有事情也会互相交谈,所以学生之间也可以传递信息。学生也可以向老师问问题,所以学生也可以向老师传递信息。如果把每个人都看作一台计算机,那就可以将这个教室看作局域网,大家可以相互通信。

然后,老师叫小明上黑板做题。这句话其实班级内的所有人都听到了,但是因为老师叫的是小明,所以只有小明做出了反应。小红、小刚等其他人知道老师叫的不是自己,就直接忽略了。

这些放到局域网中也一样,局域网中的所有主机都在相互通信。如果一个主机发送了一条信息,所有的主机也都能收到。只是需要该数据的计算机会处理该数据,其他不需要该数据的计算机虽然接收数据,但不会处理它。

我们上面说到的通信方式就是以太网的通信原则。实际上局域网的通信准则有很多,最常见的就是以太网、令牌环网还有无线LAN。正因为最早网络通信局限于局域网,所以不同地区的通信标准会有所差别。

4.局域网通信的过程

我们举一个例子,用户A和用户B用QQ聊天,A用户给B用户发了一句你好,B用户也接收到了。那这个你好是怎么发送到B用户的电脑上的呢?

首先,我们先向应用层发送你好,这是一个字符串。

这个字符串到达应用层后就需要在前面加上应用层的协议报头,这个报头我们用圆圈表示。

应用层再将加了报头的报文交给传输层,传输层会在前面再加一个传输层的协议报头,我们用四角星表示。

传输层再将加了报头的报文交给网络层,网络层会在前面再加一个网络层的协议报头,我们用六角星表示。

网络层再将加了报头的报文交给数据链路层,数据链路层会在前面再加一个数据链路层的协议报头,我们用云朵表示。

数据链路层再将加了报头的报文交给物理层,此时数据就能交给网络了。

在用户B的电脑接收到的数据会保存物理层中。此时,数据需要传递到应用层。物理层去掉自己的报头(云朵)向数据链路层传递数据,数据链路层去掉自己的报头(六角星)数据向网络层传递数据……

就这样数据不断向上传递,到应用层时,应用层将自己的报头(圆圈)去掉,就将你好显示在了聊天框内。

所以,我们需要知道以下结论:

  • 在同一层内,二者在宏观上都使用相同的协议传递信息。
  • 数据从模型上层向下不断加报头的过程叫做封装,从下层不断去掉报头的过程叫做接包。下面是封装的过程的图示:

  • 在每一层的报头信息中,一定保存了两个内容,即报头和有效载荷在哪里,还有自己的有效载荷应当传递给上层的哪一个协议。

5.一些局域网的介绍

我们常用的局域网通信标准有以太网、令牌环网和无线LAN。

以太网的通信逻辑上面说过了,同一时刻只允许局域网内的一个主机发送信息。

以太网这个名字的来历还是有个小故事,大家如果上过大学物理可能会对以太这个词有印象。以太最早由亚里士多德提出,它被认为是充满世界的五大元素之一。

后来18世纪,笛卡尔、惠更斯和牛顿都认为以太是存在的,一方面是他们认为光声等的传播需要介质,物质也需要以太进行相互作用。

到了19世纪,由于杨氏干涉的提出,以太论又开始火热。此时的以太不光作为介质,也作为绝对静止的物体存在。所以当时各个科学家就都开始研究这个东西是否存在,也包含爱因斯坦。但研究了半天,他们并没有找不到以太存在的证据,反而找到了一些不存在的证据。所以,直到现在我们都认为以太是不存在的。

到了计算机网络发展的年代,新的科学家们发明出了上面这样的局域网,他们想到物理学家研究以太的各种故事,就把这种局域网起名为以太网。本来这只是玩个物理学家的梗,没想到这个名字一直流传到了现在。

令牌环网就是在某个计算机内发送一个数据,这个数据只能被一个电脑接收到。接收到这个数据的计算机就能够发送数据到网络,而拿不到这个数据的主机就不能发送数据。到这里我们也能认识到,令牌环网的实现和我们学过的锁很像,确实如此,我们学到的知识都是相通的。

无线LAN是以太网的一个变种,用的相对少一些。

五、跨网络通信

1.IP协议的作用

所谓跨网络通信就是两个需要通信的主机不在同一个局域网里,一旦需要跨网络,那就需要路由器发挥作用了。

我们看下面这张图,依旧是用户A给用户B发送数据。

用户A发送的你好字符串会不断封装至驱动部分,也就是数据链路层。

由于路由器和用户A的主机属于同一个局域网,所以数据封装到数据链路层就可以传输到路由器上。

路由器必定有两个接口连接用户A和用户B所在的局域网,而此时由于这两个局域网数据链路层协议不一致,再加上路由器工作在网络层,所以路由器会把原来以太网的的报头(以云彩表示)删掉。

然后路由器会再给数据加上令牌环网的报头(以圆对话框表示),此时数据就符合了用户B所在局域网的数据链路层协议,数据就可以一层层向上解包,最终B用户收到”你好“的信息。

打个比方就是,你在冬天从天津去三亚旅游,在冬天的天津你必须穿羽绒服,而在冬天的三亚你只需要穿短袖。所以在上飞机时你穿着羽绒服,而下飞机就要换成短袖。数据在路由器中也要经过脱一件衣服,再穿一件衣服的过程。

正是IP这样的通信方式,能够保证在数据链路层协议不同,或者说局域网配置不同的情况下,让各种局域网链接为广域网。

2.IP地址与MAC地址

我们之前使用ifconfig指令看到了Linux机器的MAC地址,ether表示以太,在它后面的由冒号隔开的6个16进制数就是MAC地址。

  • MAC地址总共6个字节,48个比特位,一般用16进制数字加上冒号的形式表示,通常用于局域网。
  • MAC地址在网卡出厂时就已经确定,不能修改,通常是唯一的。(虚拟机中的mac地址不是真实的mac地址, 可能会冲突)
  • 计算机的MAC地址需要保证在局域网中的唯一性。

同样在上面的图片中,inet后面的由点隔开的4个10进制数就是IP地址。

  • IP地址是在IP协议中,,用来标识网络中不同主机的地址,通常用于广域网和局域网。
  • IP协议有两个版本, IPv4和IPv6。IPv4在全世界都广泛使用,IPv6只在中国使用较多。后面凡是提到IP协议,默认都是指IPv4。
  • 对于IP协议(IPv4)来说,IP地址是一个4字节,32位的整数。
  • 我们也称IP地址为“点分十进制”字符串,例如10.0.8.7,用点分割的每一个数字都表示一个字节,数据范围是 0 - 255。

那二者又有什么关系呢?

我可以举个例子,比如说我要从天津市武清区杨村到天津市和平区的劝业场,那我就需要从高德地图等软件上查找可选择的路线。

比如说,我先去创意米兰公交站等749路公交,坐公交到北辰道地铁站。那我的上一站就是家,下一站就是北辰道地铁站。

我到达地铁站后,我要从北辰道站坐地铁转运到和平路站,此时我的上一站就是创意米兰公交站,下一站就是和平路地铁站。

从和平路地铁站出来后,我要沿着和平路走350米到劝业场.此时我的上一站就是北辰道地铁站,下一站就是天津劝业场。

最后我走到劝业场就可以了,但在这其中我的起始地址家和最终地址天津劝业场始终没有发生改变,而上一站和下一站的地址一直在变。

其实对于跨网络的通信也是一样的,最早发送数据的主机IP叫做源IP,最终数据的目的主机IP叫目的IP。

由于主机大部分都不在一个局域网内,所以主机需要在广域网中标识自己的唯一性。源IP与目的IP大部分都使用IP地址,这两个地址可以为我们未来每一个阶段提供方向目标,方便传输的路径选择。

而对于网络传输的上一站,下一站而言,它们一直在不断变化,而且更多的都在局域网内传输。所以这类地址常用MAC地址,为当前的路径选择提供可行性。

3.跨网络通信的大致流程

跨网络通信的过程大致如下图:

一个用户的数据会被封装到物理层,然后发送给目的IP决定的下一个节点。在下一个节点,数据会被解包至网络层,此时根据目的IP,该节点的设备又会将数据封装至物理层再次发送至下个节点……直到最后发送到目的IP的主机,该主机将数据完全去除报头展现给用户。

上面便是我们网络基础的全部内容了,此时我们能够初步认识网络的运行逻辑并开始接触socket套接字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程基础 的相关文章

  • 内核驱动程序从用户空间读取正常,但写回始终为 0

    因此 我正在努力完成内核驱动程序编程 目前我正在尝试在应用程序和内核驱动程序之间构建简单的数据传输 我使用简单的字符设备作为这两者之间的链接 并且我已成功将数据传输到驱动程序 但我无法将有意义的数据返回到用户空间 内核驱动程序如下所示 in
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip

随机推荐

  • Mybatis的逆向工程详解

    今天用mybatis的逆向工程生成mapper xml文件的时候 由于用到的第三方可视化数据库工具的不支持 里面生成的xml文件中缺少了对主键的操作 于是上网查了别人的工程 对照了一下自己把mapper xml补齐了 下面贴出网上别人写得好
  • Transport Client 与 Node Client 官网谈差别

    通过使用elasticsearch 5 x版本 由于是追着潮流 所以遇到了很多疑惑和坑 接下来我们来看一下我一开始用5 x出现两个client 时关于两者区别的疑惑 Transport Client 与 Node Client 如果你使用的
  • 单列集合系列之Set集合的初了解

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于单列集合的相关操作吧 目录 Welcome Huihui s Code World 顶级接口Collection 概念 方法 共性通用 一 Set集合的特点
  • [附源码]JSP+ssm计算机毕业设计彩虹社区残障人士管理信息系统的设计与实现ed5nd【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • Vue源码之AST抽象语法树

    Vue源码之AST抽象语法树 AST抽象语法树全称Abstract Sybtax Tree 简称就是AST 其作用就是Vue在解析模板时 会把模板编译成抽象语法树 在进行diff最小量更新算法等 AST抽象语法树是Vue渲染引擎的第一道工序
  • 写给小白的android 事件分发机制

    介绍 当我们手指在屏幕上进行操作时 系统根据我们的操作进行反应 系统为了更好的记录我们的操作 将我们的手指的所有操作分为三类操作 统一封装在MotionEvent类中 把大象装进冰箱只要三部 1 打开冰箱 2 把大象扔进去 3 关闭冰箱 操
  • Windows7之天镜漏洞扫描工具安装

    01 天镜漏洞扫描工具安装 01 安装天镜 02 升级漏洞 03 重启win7 多次重复升级过程 1次可能没办法成功 04 成功之后查看版本
  • Java8 Stream Lambda sorted()之正序倒序

    下面代码以自然序排序一个list list stream sorted 自然序逆序元素 使用Comparator 提供的reverseOrder 方法 list stream sorted Comparator reverseOrder 使
  • 解决zipfile压缩的文件路径太深,直接调用即可

    import os import zipfile import shutil def zipDir dirpath outdir 把路径中最后一个文件夹的名字取出来作为雅苏报的名字 zip path dirpath split 1 prin
  • unix命令

    一 查看机器上是否还有java线程 ps ef grep java 二 查看和清理机器文件 1 查看机器磁盘总空间以及剩余空间大小 root localhost df h 2 查看当前目录使用的总空间大小 root localhost ho
  • 入职1024天,写于万般困顿之时

    最近攻关一个项目到杭州出差 预计还要十多天才能回去 每天在小黑屋里加班到很晚 外加大领导很凶 双重压力之下累的喘不上来气 猛然发现自己已经入职整整1024天了 照照镜子也没入职前那么意气风发了 今天还是太晚了 明天还要早起 留个档占个位置
  • Python---正则表达式

    专栏 python 个人主页 HaiFan 专栏简介 Python在学 希望能够得到各位的支持 正则表达式 前言 概念 作用和特点 使用场景 正则符号 re模块 re compile match search span findall gr
  • Python中pip安装与使用

    一 Pip的安装方法 1 在Windows中的安装方法 操作环境 Windows10 Python3 7 其实你在安装python的时候 pip就随同一起安装了 一般情况下 可以直接使用 如果不能使用 基本上就是没有添加环境变量而已 添加下
  • 性能监控诊断,cpu,I/O,内存,网络诊断

    1 内存 cpu 网络 磁盘 2 当系统出现问题时 我们需要从应用程序 操作系统 服务器设备 网络环节系统资源等多方面综合排查 定位分析问题 然后集中解决问题 3 响应时间 服务器响应时间 网络时间 4 总体来说 系统提供了比较多的有用信息
  • 【Mysql】日期、行变列(IF、CASE WHEN THEN)语句总结

    获取昨天的日期 日期相减函数 datediff select datediff curdate INTERVAL 1 DAY 删除Person表中重复的Email数据 只保留id最小的一条 delete p1 from Person p1
  • mock方法常用框架_Mock框架Mockito入门教程

    在开发中 我们经常会依赖同事或者第三方提供的接口 如果该接口无法正常工作 比如接口正在修复 或者网络异常等 那么便会对需要依赖该接口的开发造成很大影响 遇到这种情况 我们可能会想到模拟该接口以提供正常的返回值 用来继续当前的工作 使用Moc
  • Qt信号槽进阶及误区

    lambda写法 Qt 中信号槽lambda表达式优缺点 好处 代码更加紧凑 不用特意费力去定义一个常规的函数 坏处 一旦写的过长 臃肿 代码可读性会变差 C 中lambda表达式构成 capture parameters mutable
  • 数据模型及E-R模型

    数据模型的基本概念 模型就是对现实世界特征的模拟和抽象 数据模型是对现实世界数据特征的抽象 对于具体的模型人们并不陌生 如航模飞机 地图和建筑设计沙盘等都是具体的模型 最常用的数据模型分为概念数据模型和基本数据模型 1 概念数据模型 概念数
  • 不拼花哨,只拼实用:unittest指南,干货为王!

    Python为开发者提供了内置的单元测试框架 unittest 它是一种强大的工具 能够有效地编写和执行单元测试 unittest 提供了完整的测试结构 支持自动化测试的执行 能够对测试用例进行组织 并且提供了丰富的断言方法 最终 unit
  • 网络编程基础

    目录 一 网络的概念 1 认识网络 2 网络的发展 二 协议 1 网络问题的产生 2 什么是协议 3 网络协议 三 协议分层 1 协议分层的概念 2 OSI七层模型 3 TCP IP四层 五层 模型 1 物理层 2 数据链路层 网卡层 3