赞
踩
目录
在开启Linux网络编程的学习之前我们需要认识什么是网络?
在生活中我们口语化的网络,一般是互联网,而在计算机术语中网络本质上是一种连接关系,只要是存在链接关系就可以称为网络。例如对于一台计算机,内部的硬件是通过实体化的电路线连接而成的网络。对于多台计算机则通过交换机、路由器形成的区域性的网络……
我们已经知道了计算机通过网络可以串联起来,那串联起来的的意义在哪呢?
显而易见,我们在日常使用手机时,没有wifi、流量时我们无法发微信、打王者、刷抖音这一类需要进行客户端和服务器交互的行为,所以计算机网络的形成是为了进行不同的计算机进行网络通信!
总而言之:计算机网络的形成是为了进行通信!
当我们形成计算机网络后,小明要给他的暗恋对象小红发一句“我喜欢你”,结果发给了小芳……,在计算机网络中会出现许许多多的主机,当我们进行网络通信时,我们要通过协议来找到指定的接收方。同理在单台主机中,数据从键盘中读入再转载到当前网卡也是需要协议的。
简单来说:协议就是一种约定
当计算机在读取数据时,发现数据中存在向网卡输送的标志(协议)时,就往网卡输送。当网卡读取到输送给小红,网卡就不会发送给小芳。
更重要的是:计算机网络一定要保证各种不同的机器都要无障碍地接入网络,比如手机、电脑、智能手表都可以接入同一片网络,不同品牌的设备也要能够接入,所以协议一般是具有一套被所有人认可的标准。
如图在这个简化的过程中,我喜欢你需要通过键盘传输到网卡,那么这一句话会不会在传输过程中没有传到网卡,而是传到磁盘了呢?从小明的网卡传输到小红的网卡呢?或者是从小红的网卡传到了小红的文件中呢?
因为计算机这个个体,内部是有不同的模块,所以不同的模块之间的通信各有不同,所以就需要不同的协议,进行分层。
实际上计算机协议分层是为了解决以下问题:
- 如何保证将数据传送给下一个主机
- 在转发中如何进行路径选择和目标主机定位的问题
- 如果报文中出现错误,传输出现丢失
- 我们将数据传输到目标主机,如何对数据进行解读
首先计算机的网络会有很多中间主机:路由器、服务器,我们在进行微信聊天时,并不是小明直接跟小红说的,而是需要中间的主机进行数据的传输,因此我们就需要协议分层来解决传输距离变长导致的问题和数据的解读问题。
然而实际应用时因为5、6、7层的协议分开实现太过于困难,并且也不太简洁,最终OSI模型的应用逐渐被TCP/IP模型替代。
物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层。
网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.
TCP/IP模型较于OSI模型,将应用层、表示层、会话层综合成单层应用层。
并且如图我们可以看出操作系统和网络也是紧密联系的,在网络通信中操作系统扮演着将数据从用户层(应用层)获取,在通过传输层传输至物理层的角色。
我们在上面提及:网络协议的制定本质上是为了解决计算机之间进行通信时出现的数据问题。
而协议的实现本质上也是“先描述再组织”,即定义相关的结构体来存储数据,然后抽象出数据结构来进行数据的增删查改和传输!那么我们实现计算机网络的通信模型的本质就是分层的实现网络协议栈的软件抽象。接着让所有的计算机通信设备生产商,也遵循这一套软件标准,这样子就能够实现不同类型的设备、不同品牌的设备进行数据传输!
类似与操作系统这一款软件,我们通过定制相同的通信软件模块实现统一的通信标准。
如图为局域网通信的一个示意图:
我们在某宝上买了一件商品,当我们收到商品时,除了商品外还有贴着一张快递单,在计算机网络中这张快递单叫做“报头”,商品叫做“报文”。当快递运送时,需要从商家到快递小哥到快递公司到快递小哥最后到达你的手上。
对于网络通信而言,我们发出一段消息后,操作系统自动地给消息添加一段身份信息,也就是报头,而我们制定出的网络协议本质上就是为了形成统一的报头(增加结构化字段),当我们发消息时根据协议加报头,收到消息时去掉报头。
某一层的报文(发送的数据) = 报头(协议报头) + 有效载荷(数据内容)
逻辑上:我们进行网络通信是从小明传给小红,小明的TCP到小红的TCP,小明的IP到小红的IP,小明的数据链路层到小红的数据链路层。
实际上:我们需要一层层不断地给数据(有效载荷)添加报头进行封装,然后通过网络传输给对端的网卡。接着通过协议自底向上的解开报头,进行解包分用。
那么网络协议需要解决:如何对数据进行封装传入网络,如何对网络获取的数据进行解包分用。
我们在日常使用时,遇到的ip地址是内网ip。而公网ip一般是为了给别人提供服务,为了让该服务器唯一,让客户端实现正确的访问服务器的唯一地址。
对应ip地址和Mac地址的关系我们可以这样理解:小明坐地铁从A大学去B大学,当他到达地铁站时,对于小明而言:他的目的地是B大学(目标ip地址),他当前所在的地铁站的地址就可以看做一个Mac地址。当他在去往目标ip地址的过程中,需要知道下一站的Mac地址。
实际上,mac地址是为了在局域网中的唯一标识。比如数据从你的主机到达交换机、路由器,因为数据的传输距离太长会导致数据传输失真,因此需要中转主机,那么有了中转主机就需要右中转主机的地址。
当用户向目标ip传输数据时,数据在源主机进行封装,离开物理层时,报头信息包含:mac地址、ip地址,如图mac1对应路由的主机1,这时整段数据报文,需要被解包到网络层后重新封装,在mac1中的数据链路层将mac地址对应修改为src:mac1,dst:mac2……最终这样一步一步的传输,解包分用,再封装,直到mac3中读取到dst为目标ip的mac地址,实现数据经由多个主机从源ip传送到目标ip
总而言之:ip地址是用来找到通信目标主机的地址,而mac是为了找到中转的主机和达到中转主机后获取下一个主机的mac地址,最终才能达到目标ip地址。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。