在计算机网络知识(一)(http://t.csdn.cn/WoCWf)中大致了解了OSI七层模型(终于不再同看天书似的了),并对网络数据在各层如何进行封装传输有了初步了解。前面也提到了三种网络模型,本人在视频学习中发现五层模型确实比较适合于教学理解,再者作为计算机通用语言的TCP/IP协议也是四层模型,只是把物理层和数据链路层整合为网络接口层了。因此本文通过对五层模型的深度学习总结去理解网络通信和TCP/IP协议,更具体的去理解网络数据在各层如何进行封装传输以及各层的一些重要设备(比如数据链路层的交换机、网络层的路由器和传输层的网关)的具体作用,彻底告别这25年来对诸如子网掩码、网关、端口、MAC地址等专业名词的陌生。
层 | 干了什么 | 属于这层的东西 |
物理层 | 在物理介质中传输数据 | 网线、光纤 |
数据链路层 | 同一链路(网段)通信 | 网卡、交换机 、MAC地址 |
网络层 | 不同网段通信 | 路由器、IP地址 |
传输层 | 数据包到达目标计算机后发送到相应软件(进程) | 端口 |
应用层 |
物理层是OSI参考模型的最低层,物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,使数据链路层不必考虑网络的具体传输介质是什么。简单的说,物理层确保原始的数据可在各种物理媒体上传输。物理层规定了物理设备标准、电平、传输速率等。常用设备有集线器、中继器、调制解调器、网线、双绞线、同轴电缆等,这些都是物理层的传输介质;最常用的RS-232规范、10BASE-T的曼彻斯特编码以及RJ-45也属于物理层。
中继器(Repeater):也叫放大器,又叫重发器,是LAN(局域网)环境下用来延长网络距离的互连设备中最简单、最廉价的设备。中继器是物理层上的网络互连设备,它的作用是重新生成信号(即对原信号进行放大和整形)。
集线器(HUB):集线器实质是一个中继器,主要功能:对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。集线器使用星型网络布线,如果一个工作站出现问题,不会影响到整个网络的正常运行。总之,数据包进到集线器的一个端口,它仅仅是把数据重新广播到每一个有设备连接到的端口上,这种情况不只带来了安全风险,也在网络上产生了很多不必要的流量,浪费了网络带宽,因此大部份集线器已被交换机取代,因为交换机很智能,能够学习连接到它端口上的设备的物理地址。(还有USB集线器、RS232/484集线器)
总结:对于链路层及以上的协议来说,中继器互连起来的若干电缆在作用上与单根电缆没有什么区别。物理层设备和其他层次的设备(如网桥、路由器)最大的区别在于:集线器和中继器工作在同一个网段下的,而路由器等设备是工作在不同网段下的。
如上图,一般家庭的网络环境都是这样的,首先是一根入户光纤插到猫(modem,和猫读音相近所以称之为猫)上面,然后再用网线连接了猫和路由器,再用网线连接路由器和电脑,路由器它是可以发射wifi的,然后咱们再用手机通过wifi可以连接到咱们这个路由器上面来。首先看一下猫,现在猫都很少了,拉到家里面的一般都是光纤,所以说家里面一般都是光猫。那么猫有什么功能呢?它的功能就是把要传输的信息转换成适合传输的频率形式,数据在光纤里面是以光信号的形式传输的,肯定不能网线上传输,需通过光猫把光信号变成电信号或者是其他的模拟信号,然后再通过网线传输。
猫和光猫的区别:一个不支持光纤,一个支持。现在都是光猫。
物理层是网线、光纤等所提供的信号通道,不同的信号通道传输的信号形式不一样,这时候就需要调制、解调。猫就充当调制解调器的作用。
宽带知识普及:
家用20M的宽带,最大下载速度达不到20M,一般都只是2.5M,因为两个描述单位不一样,一般说20兆宽带用的是Mb为单位,下载速度一般是以MB单位,换算关系是1MB=1Mb,所以20兆的宽带除以8以后为2.5,这就是最大的下载速度。
为什么有时候wifi信号是满格的但是就是没有网?首先得明白手机连上了wifi就能够上网,是因为连上了wifi就等于连上了路由器,路由器有网,所以手机才能上网。如果路由器它本身就没有网,wifi信号再强,只能说明你跟路由器之间的连接很强,但是路由器没有网,所以手机上不了网。那么路由器为什么没有网呢?原因有很多:可能是网线坏了,或者是猫、光猫坏了,或者是网络运营商在维护,也可能是宽带欠费了。
数据链路层的具体工作是接收来自物理层的位流形式的数据,并封装成帧,在封装的时候会加上MAC地址,传送到上一层,“帧”是数据链路层数据的基本单位;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息, 以便提供可靠的数据传输。
在数据链路层中,链路层地址有很多中不同的称谓:LAN 地址、物理地址或者 MAC 地址,因为MAC 地址是最流行的术语,所以我们一般称呼链路层地址指的就是 MAC 地址。
MAC地址:传说中的物理地址,与IP地址都是网卡的属性,网卡出厂的时候就有全球唯一的MAC地址。以太网适配器的意思就是以太网网卡。
MAC地址长度为6字节48位,通常采用16进制表示法,用-或:连接起来。
注:只有帧数据是有头部和尾部的,其他层数据只有头部。
数据链路层是一种协议层,它有很多协议。数据链路层用于跨物理层在网段节点之间传输数据,通常指以太网、无线局域网等通信手段。数据链路层提供了在网络的两个实体之间传输数据的功能,并且提供了差错检测(奇偶校验码和循环冗余检验码)用于纠正物理层中发生的错误。简单来说:数据链路层解决的是在同一链路(网段)的通信。
什么是局域网(LAN)?
局域网是一个局部范围的计算机组,比如家庭网络就是一个小型的局域网,里面包含电脑、手机和平板等,他们共同连接到你家的路由器上。又比如学校的机房就是一个局域网,里面有几百几千台电脑,当机房无法上外网时,但是电脑之间仍可以通信,你们可以通过这个局域网来打CS 、玩红警。理论上,局域网是封闭的,并不可以上外网,可以只有两台电脑,也可以有上万台。
什么是广域网(WAN)?
广域网的范围就比较大了,可以把你家和别人家、各个省、各个国家连接起来相互通信。广域网和局域网都是从范围的角度来划分的,广域网也可以看成是很多个局域网通过路由器等相互连接起来。
什么是以太网(Ethernet)?
以太网可以看成是一种实现局域网通信的技术标准,是目前最广泛的局域网技术。以太网的运行速率有10Mbps,100Mbps,1Gbps,10Gbps的,它的传输介质有的是双绞线,有的是光纤。简单的说,以太网就是在局域网内,把附近的设备连接起来,可以进行通讯。
什么是互联网(Internet)?
互联网可以看成是局域网、广域网等组成的一个最大的网络,它可以把世界上各个地方的网路都连接起来,个人、政府、学校、企业,只要你能想到的,都包含在内。互联网是一种宽泛的概念,是一个极其庞大的网络。
以太网和局域网区别:
以太网是一种局域网,而局域网却不一定是以太网,只是由于目前大多数的局域网是以太网,所以一般说局域网,大家都默认为以太网。以太网是一种局域网,只能连接附近的设备,因特网是广域网,我们可以通过因特网连接到美国去得到消息。以太网、互联网这是两个不同的概念,比如互联网 Internet 、广域网 WAN、局域网LAN可以算作一类,按照区域和范围来分类。
以太网和因特网区别:
两者都算是用来连接电脑的网络,但是两者的范围是不同的。以太网是局限在一定的距离之内的,我们可以有成千上百个以太网;但是因特网呢,是最大的广域网了,我们只有一个因特网,所以因特网又可以说是网络中的网络。正是由于以太网的成功推广,才使得它支持的TCP/IP协议随之成为虽然不是标准但是却比标准应用更广泛的实际标准。以太网是比较安全的,因为他是一个封闭的内部网络,外部人员是没有权限的。但是因特网是公开连接的,每个人都可以浏览。
在日常生活中,拓展局域网最常见的方法是使用网桥。最简单的网桥有两个端口,复杂些的网桥可以有更多的端口。网桥的每个端口与一个网段相连。网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,它能将一个大的LAN分割为多个网段,或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器。总结一下:网桥相当于虚拟网线,工业上网桥经常用来传输摄像头数据,当然也可以用来传输任何网络数据,如果在同一小区有两套房并且之间没有障碍物的话就可以用网桥来节约一套房的网费了。
什么是网段?
同一网段指的是IP地址和子网掩码相与得到相同的网络地址。想在同一网段,必需做到网络标识相同。即同一网络号。
从通信的角度来说网段是指一个计算机网络中使用同一物理层设备(传输介质、中继器、集线器)能够直接通信的那一部分。也就是说,互联网划分为大大小小的网络,而一个网段只属于互联网中的某一个网络。 如下图3所示:这张网络图可以划分为三个小网络并且不能再细分,这个小网络就是一个网段,因此可以说网段是一个不可再细分的网络。
为了可以通过MAC地址对不同设备进行数据的传输,就出现了交换机(此处指二层交换机,三层交换机带路由功能此处不做拓展)。它的主要功能:把数据包发送到正确的位置。
在上面1.1节中提到的集线器就是交换机的前身,由于它仅仅是把数据广播到每一个有设备连接到的端口上,这对网线资源和网卡资源造成浪费,因此交换机应运而生,逐步替代集线器。交换机工作在数据链路层,原理等同于多端口网桥。作用是连接数个相同网段的不同主机,减少网内冲突,隔离冲突域。利用存储转发和过滤技术来从物理上分割网段。
交换机就是对MAC地址进行转发,在每个交换机中,都有一张MAC地址表,这个表是交换机自动学习的。交换机刚启动时,MAC地址表中无表项,当接入PC的时候,交换机开始进行学习MAC地址。数据包到达交换机时会读取目的MAC地址,然后转发给相应物理端口上的设备。
交换机工作机制:
每一包数据都会有两个MAC地址,源MAC和目标MAC,交换机收到一包数据后
1、首先源MAC与接收端口绑定,填入MAC地址表;
2、读取目标MAC在地址表中查找发出端口发送数据,此时会出现两种情况:MAC地址表中查到关联端口即发出,未查到关联端口即群发,称之为泛洪;
3、这样运行一段时间就可以找到网络中的所有网卡设备。
网桥和交换机都工作在数据链路层,数据包会根据MAC地址来发给指定的端口,不存在hub的那种不管三七二一就广播带来的安全问题。
我们平常所说的链路通常指以太网链路,这是一种广播链路,广播包发给交换机的时候广播链路上的每一个设备都可以收到这个包。除了广播链路还有点对点链路,常见的PPPoe宽带拨号会建立一条PPP链路就是点对对链路。拨号的话一般是在路由器界面设置的,采用PPPoe的方式进行拨号。拨号其实就是与中国电信那边建立一条点对点链路通道,通过这条通道的话你就可以上因特网,理解不了的话也没有关系,我们可以浅显的认为拨号就是登录宽带,登录之后路由器才能够接入因特网。点对点协议是链路层封装协议的一种方法。
广播链路和点对点链路最明显的区别就是广播链路帧头含有源MAC和目标MAC,点对点链路帧头不含MAC地址。因为点对点链路是一个专属通道,只能够给两端设备通信使用,所以不需要MAC地址。
图4为家庭常见的网络结构图,在路由器内部可以看成是一个二层交换机以及最核心的软件层面路由器(网关),当然还有其他东西此处不做讨论。显而易见电脑1和电脑2是连接在同一个路由器上面的两台电脑,它们的IP的也在同一个网段,假设电脑1要向电脑2发送数据,它们之间通信不需要经过网关(软件层面路由器),而是直接到达交换机,交换机维护了一张MAC表,定向将数据传输给电脑2。此处有一个问题值得思考:封装数据包是需要将目标MAC地址放进去的,电脑1如何知道电脑2的MAC地址?
其实计算机维护了一张arp表,它是一个IP到MAC的映射,可以通过arp -a命令查看,如下图5所示是本人电脑输入该命令的结果,可以看出IP地址与MAC地址一一对应。
如何获取目的MAC地址?(ARP协议)
TCP/IP里面用的是ARP协议。比如新建了一个内网,如果一台机器A找机器B,封装FRAME时要封装对方的MAC,开始时A不知道B的MAC,他就发一个ARP包(ARP-request),源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是广播的(FF-FF-FF-FF-FF-FF)。然后这个请求包在内网内被广播,当其他机器接到这个包时,用目的IP和自己的IP比较,不是的话就丢弃。B接到时发现IP与自己的一样,就答应这个包的请求,把自己的MAC送给A(ARP-replay)。如果B是其他子网的机器,那么路由器会判断出B是其他子网,然后路由器把自己的MAC返回给A,A以后再给B发包时,目的MAC封装的是路由器的。
注:数据帧经过交换机时,其源、目标MAC是不会变的,如图6所示。交换机只会关心数据包中的MAC地址,而不会关心IP地址,MAC地址在TCP/IP协议中处于第二层数据链路层,所以交换机通常也被称为二层设备。
当源端和目的端位于不同网络的时候,直接通信是不可行的,此时就需要由网络层解决。如果我们把物理层和数据链路层比作市内交通,那么网络层就可以比作连接不同城市交通的中转车站、机场或码头。就像中转车站、机场或码头可以把来自其他城市的旅客送到下一站或本市目的地一样,网络层可以把来自其他网络中的数据传送到下一个途经的网络或本网络中的目的节点。而路由器就相当于连接不同城市公路的中转车站,起数据中转作用。简单来说:网络层解决的是在不同网络(网段)之间的的通信。网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。包就是网络层里数据的名字,路由器根据包里的IP地址进行路由转发,地址管理和路由选择就是这一层的核心。
网络层中涉及众多的协议,其中包括最重要的协议,也是TCP/IP的核心协议——IP协议。IP协议非常简单,仅仅提供不可靠、无连接的传送服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。IP协议使得复杂的实际网络变为一个虚拟互联的网络;并且解决了在虚拟网络中数据报传输路径的问题。
图8为IP数据报格式:其中,版本指IP协议的版本,占4位,如IPv4和IPv6;首部位长度表示IP首部长度,占4位,最大数值位15;总长度表示IP数据报总长度,占16位,最大数值位65535;TTL表示IP数据报文在网络中的寿命,占8位;协议表明IP数据所携带的具体数据是什么协议的,如TCP、UDP。
IP(IPv4):IP地址就是门牌号(电话号),在网络中我们通过IP地址与相应的计算机进行通信。比如说我们访问bilibili.com时看上去没有IP地址,其实电脑会通过dns把它转成相应的IP地址。IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中a,b,c,d都是0~255之间的十进制整数。例:点分十进制IP地址(100.4.5.6)。
两个特殊的IP地址:广播地址:主机位全为1,向这个地址发数据包,网段中所有设备都会收到;网络地址:主机位全是0,表示这个网络。以192.168.123.1所在网段的网络为例,假设子网掩码为255.255.255.0,那么广播地址是192.168.123.255,网络地址是192.168.123.0。
子网掩码:IP地址由网络号和主机号两部分组成的,子网掩码就是告诉计算机哪些是网络号,哪些是主机号。子网掩码与IP地址类似,也是一个三十二位的二进制数,通过IP地址与子网掩码相与就可以确定网络地址和主机地址分别占用多少位。子网掩码还有另一种表达方式:它通常是和IP地址一起表示的,例192.168.1.1/24,其中24表示子网掩码中前24位是1。
私网(内网):私网等于局域网,以用户家的光纤路由器为边界,路由器的Internet端口、或者WAN端口连接的为互联网(运营商接入网)。路由器的LAN端口连接的、无线连接的手机、电脑组成的网络统称为私有网络。
公网(外网):公网通常指Internrt(因特网),也就是世界上最大的互联网,因特网是世界上最大的互联网。实际中,我们日常生活所说的互联网,其实一般指的是因特网。
内网IP和公网IP:私有IP就是因特网保留给私人网络的IP,我们可以拿这些IP来做路由器的IP,这样就不会跟公网冲突,通过ipconfig命令查看的一般就是自己的私网IP,私网IP是在一定范围内的,IP地址分为5类,分别适用于不同的环境。哔哩哔哩服务器肯定是公网IP,我们要上网肯定是有公网IP的,在百度搜索里面直接搜IP就可以看到自己的公网IP了,这里就不做过多讲解。
NAT(网络地址转换):网络地址就是IP地址,一般我们都没有公网IP,但是上因特网是需要公网IP的(我们用的都是运营商的公网IP),这个时候我们就要用到NAT了。
什么是网关?
网关又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。网关实质上是一个网络通向其他网络的IP地址。
什么时候需要网关?
如果说目标IP也就是通信的IP在同一网段的时候可以直接通信,不需要经过网关,否则就需要经过网关。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。
所以,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。
图9这些异构型网络如果只是需要各自内部通信,他们只要实现各自的物理层和数据链路层即可。但是如果要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络层设备路由器。 路由器就是网络层的核心,它承担了一个在不同网段之间通信的功能。
图10为路由器内部功能结构示意图,在路由器内部可以看成是一个二层交换机以及最核心的软件层面路由器(网关),还有防火墙等。核心就是交换机+网关,默认网关就是软件层面的路由器。
首先讲一下家里我们常见的路由器的功能:路由器会自动拨号(拨号就是连上网,也有可能是光猫拨号),之后就可以通过网线和wifi,连接手机和电脑等设备,这样手机电脑就都能上网了。wifi是路由器发射出来的东西,可以把wifi当做一根无形的网线连接手机,电脑到路由器。路由器有两种接口,一种是LAN口,可以有多个,用来连接家庭网络设备比如台式机、手机和笔记本,其中手机和笔记本通过WIFI连接到路由器,也相当于连接到了LAN口上。WAN口只有一个,用来接入运营商网络以连接到互联网中。如果把路由器的WAN口忽略只用LAN口,其实路由器就是一台交换机。加上WAN口,就可以实现不同子网之间的通信了,通信需要网关来转发,网关分别配置了属于两个子网的IP地址,可以在两个网络之间转发数据。
图11为网关通信示意图:子网1中的计算机a发送数据包时,首先计算机a会根据目标IP判断是否跟自己属于同一个子网,如果是同一个子网则直接从网卡发出;如果不是同一个子网则需要把数据包的目标MAC地址改为网关MAC,然后发送给网关,网关拿到这一包数据后再通过路由表查询到这一包数据属于子网2,网关修改目标MAC地址为计算机b的MAC地址,修改源MAC为自己的MAC,然后从子网2的网卡发出。以上出现了多次根据目标IP判断数据包应该如何发送的行为,就称之为路由。路由器有一个WAN口接入互联网,多个LAN口接入本地网络,它们就分别属于两个不同的子网,所以从内网访问互联网就是跨网络的行为,这时候就需要路由器来担任网关的角色,他的行为就叫路由。
路由转发过程:
当主机A发向主机B的数据流在网络层封装成IP数据包,IP数据包的首部包含了源地址和⽬标地址。主机A会⽤本机配置的24位IP网络掩码255.255.255.0与目标地址进⾏与运算,得出⽬标网络地址与本机的⽹络地址是不是在同⼀个⽹段中。如果不是将IP数据包转发到网关,在发往⽹关前主机A还会通过ARP的请求获得默认⽹关的MAC地址。在主机A数据链路层IP数据包封装成以太网数据帧,然后才发住到网关,也就是路由器上的⼀个端⼝。当网关路由器接收到以太网数据帧时,发现数据帧中的目标MAC地址是自己的某⼀个端⼝的物理地址,这时路由器会把以太网数据帧的封装去掉。路由器认为这个IP数据包是要通过自己进行转发,接着它就在匹配路由表。匹配到路由项后,它就将包发往下⼀条地址。
那么路由器是怎么匹配路由的呢?
假设PC3向PC7发数据包,他两不在同一网段,需要经过网关AR1(路由器),然后到AR2最后到PC7,AR1路由器是怎么知道把数据包发送给AR2的?因为路由器内部维护了一张路由表,路由器收到PC3数据包拆包获取目标IP是PC7,它就会去查询下一跳IP,有符合的就把数据转发过去。其实不同网段之间的通信最后都拆解成同一网段的通信了,关键就在于网关,网关一般是有多个物理端口,多个IP地址,存在与多个网段的。
IP地址与子网掩码相与结果相同的属于同一子网,IP/掩码表示子网,如192.168.1.0/24有255个IP,如想要扩大IP数量调小子网掩码,反之则反。子网与网段应该是同一概念吧。
windows系统命令:tracert -d ip地址(如果不加参数-d,则会将地址解析为主机名,所以会很慢,加上就快好多了)可以查看与某个IP通信需要经过哪些网关。
同一网段通信不需要经过网关:首先ipconfig查看本人电脑IP地址为192.168.2.100,子网掩码为255.255.255.0。通过一根网线将一个工业路由器(映翰通4G模块IP为192.168.2.1)与电脑直连,很明显它们是在同一网段的,输入上面命令看一下它们之间的通信过程,结果如下图13所示:
从图中可以看出直接到达目标地址,没有经过任何网关。
假设要跟哔哩哔哩的服务器通信,我的电脑肯定跟哔哩哔哩的不在同一个网段,所以肯定需要经过网关,怎么验证?首先通过nslookup命令获取哔哩哔哩服务器的IP,如下图14所示:
选择最后一个,用tracert命令查看一下中间会经过哪些路由器(网关),结果如下图15所示:
可以看到中间会经过很多路由器,因为从内网到外网是经过层层路由转发的,可以看到第一个网关(软件层面的路由器)就是家里硬件路由器里面运行的软件层面路由器,这就是第一个网关。然后第二个网关可能是小区这一层楼或者是一栋楼的一个路由器,第三个可能是小区里核心的转发的路由器,后面可能就是中国移动的区域的路由器了。通过这个就可以验证不在同一网段要经过网关,在同一网段的话就直接通信。
总得来说交换机的作用是寻址和转发,需要注意的是寻址和转发都是MAC地址;路由器寻址寻的是IP地址。路由器一般用于家庭,交换机则多用于企业办公网络环境。路由器起到网关作用,连接Internet,交换机则主要用于组件局域网。路由器内部可以进行拨号上网,然后通过共享的方式让更多电脑都可以上网;交换机不具备拨号功能,它的作用是通过将网络信号分流以实现让更多的电脑上网。路由器还提供防火墙的功能,可以仅仅转发那些特点地址的数据包,不转发不支持协议以及不知道目标地址网络的数据包,防止广播风暴。将路由器比作变压器,交换机比作插座,将内网电脑中的私有IP地址转换成互联网中的公有IP地址从而与互联网进行访问。交换机就充当多口插座的功能,增加接口的数量,可以用来组件局域网。因为路由器的LAN口有限,当电脑不具备无线网卡的时候,就需要交换机来帮忙扩展。
两个主机在同一个子网(网段),也就是说不经过路由器转发:源IP、目标IP、源MAC、目标MAC都不会改变;两个主机在不同的网段,二者之间通信需要经过路由器的转发:源IP地址会改变,目标IP地址不会改变,MAC地址会改变;
互联网中的每一台主机都需要一个唯一的IP地址以标识自己的身份,网络中传输的数据包通过IP 地址找到对应的目标主机;一台主机通常只有一个IP地址,但主机上运行的网络进程却通常不止一个,譬如 Windows 电脑上运行着 QQ、微信、钉钉、网页浏览器等,这些进程都需要进行网络连接,它们都可通过网络发送/接收数据,那么这里就有一个问题?主机接收到网络数据之后,如何确定该数据是哪个进程对应的接收数据呢?就需要用到端口号作为地址来定位了,比如客户端这里生成不同的端口号,即使同时访问HTTP端口80也是没问题的,根据不同的源端口号来作出响应就可以了。所以传输层在网络端到端基础上实现了服务进程到服务进程的传输,段就是传输层里数据的名字,传输层管理两个节点之间数据的传输,负责可靠传输和不可靠传输,也就是TCP和UDP。
端口:
端口号本质上就是一个数字编号,用来在一台主机中唯一标识一个能上网(能够进行网络通信)的进程,端口号的取值范围为 0~65535。一台主机通常只有一个IP地址,但是可能有多个端口号,每个端口号表示一个能上网的进程。一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务都是能够进行网络通信的进程,IP地址只能区分网络中不同的主机,并不能区分主机中的这些进程,显然不能只靠IP地址,因此才有了端口号。通过“IP地址+端口号”来区分主机不同的进程。数据包里面有源ip和目标ip,还有源端口和目标端口,需要注意的是,在软件中有一个非常重要的动作,叫做监听,一个软件可以监听多个端口,比如说nginx软件,它一般都会监听443和80这两个端口。当计算机收到了一个数据包,它就会先检查它的目标端口,也就是它要发到哪个端口去的,然后再看有没有软件在监听这个端口,如果有这个数据包就会发给这个软件,让这个软件去处理。需要注意软件与端口是一对多的关系,我们有时候会遇到这样的问题,想用一个软件但是它无法正常使用,提示说端口被占用了,意思就是我这个软件想监听这个端口,但是这个端口已经被其他软件给监听了,这里可以查看一下自己电脑上有哪些端口被监听的,看下它们的监听情况。(win+R运行窗口输入resmon回车后点击“网络”选项卡)
很多常见的服务器都有特定的端口号,具体详情如下表所示:
服务 | 端口号 | 说明 |
HTTP服务 | 80 | 超文本传输协议 |
FTP服务 | 21 | 文件传输协议,使得主机间可以共享文件 |
SMTP服务 | 25 | 简单邮件传输协议,它帮助每台计算机在发送或中转信件时找到下一个目的地。 |
TFTP服务 | 69 | 简单文件传输协议,主机之间进行简单文件传输 |
SSH服务 | 22 | 安全外壳协议,专为远程登录会话和其他网络服务提供安 全性的协议 |
Telnet服务 | 23 | 终端远程登录协议,它为用户提供了在本地计算机上完成 远程主机工作的能力。 |
POP3服务 | 110 | 邮局协议版本 3,本协议主要用于支持使用客户端远程管理 在服务器上的电子邮件 |
TCP(传输控制协议)是计算机网络中非常复杂的一个协议,是一种面向连接的、可靠的、基于IP的传输协议。TCP 协议工作在传输层,对上服务socket接口,对下调用IP层(网络层)。TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用"带重传的肯定确认"技术来实现传输的可靠性(采用发送应答、超时重传机制),不怕丢包、乱序。
TCP报文首部格式:
据说面试常客:为什么需要三次握手?四次挥手? 在计算机网络基础(一)中有提及。使用TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。
UDP(用户数据报协议)是一种无连接、不可靠的协议,同样也是工作在传输层。它只是简单地实现从一端主机到另一端主机的数据传输功能,这些数据通过IP层发送,在网络中传输,到达目标主机的顺序是无法预知的,因此需要应用程序对这些数据进行排序处理,这就带来了很大的不方便,此外,UDP协议更没有流量控制、拥塞控制等功能。在发送的一端,UDP只是把上层应用的数据封装到UDP报文中,在差错检测方面,仅仅是对数据进行了简单的校验,然后将其封装到 IP 数据报中发送出去。而在接收端,无论是否收到数据,它都不会产生一个应答发送给源主机,并且如果接收到数据发送校验错误,那么接收端就会丢弃该UDP报文,也不会告诉源主机,这样传输的数据是无法保障其准确性的,如果想要其准确性,就需要应用程序来保障了。UDP用户数据报协议,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。
UDP协议的优点就是速度快,因为 UDP 协议没有TCP协议的握手、确认、重传、拥塞控制等机制,UDP 是一个无状态的传输协议,所以它在传递数据时非常快,即使在网络拥塞的时候 UDP 也不会降低发送的速度。UDP虽然有很多缺点,但也有自己的优点,所以它也有很多的应用场合,因为在如今的网络环境下,UDP协议传输出现错误的概率是很小的,并且它的实时性是非常好,常用于实时视频的传输,比如直播、 网络电话等,因为即使是出现了数据丢失的情况,导致视频卡帧,这也不是什么大不了的事情,所以UDP 协议还是会被应用与对传输速度有要求,并且可以容忍出现差错的数据传输中。使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。
TCP 与 UDP 的区别:TCP是面向连接的,可靠的字节流服务;UDP是面向无连接的,不可靠的数据报服务。
应用层为操作系统或网络应用程序提供访问网络服务的接口。应用层是最接近终端用户的OSI层,这就意味着OSI应用层与用户之间是通过应用软件直接相互作用的。注意:应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的API(应用程序接口)组成。应用层数据传输基本单位为报文,包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。
DHCP(动态主机设置协议)是一个局域网协议,是应用UDP协议的应用层协议。 作用:自动配置设备IP,为临时接入局域网的用户自动分配IP地址。
设备上网是需要IP地址的,为什么设备连接到路由器或者是连接WIFI就能上网了,自己为什么不用配置IP地址?这是因为dhcp帮我们自动配置IP地址了,网线连接路由器,dhcp开始工作,首先广播一个dhcp发现包(意思就是问谁是服务器),dhcp服务器收到后会回复一个dhcp提供包(意思是我是服务器,分配可用IP地址范围和子网掩码),然后dhcp又广播一个请求包(意思是我设置这个IP地址和子网掩码),最后dhcp服务器回复提供包表示可以,这样就完成了自动配置,可以上网了。家庭网络一般是硬件路由器充当DHCP服务器,其里面运行了DHCP软件(服务端)。路由器后台可以设置是否启用dhcp服务器。
DNS(域名系统):解决IP地址复杂难以记忆的问题,存储并完成自己所管辖范围内主机的域名到IP地址的映射。根据域名查询其指向的IP。
HTTP协议(超文本传输协议):是可靠的数据传输协议,浏览器向服务器发收报文前,先建立TCP连接,HTTP使用TCP连接方式(HTTP自身无连接)。
在浏览器中输入 http://www.baidu.com/ 后执行的全部过程如下:
客户端在浏览器中输入http://www.baidu.com,baidu.com为要访问的服务器,下面详细分析客户端为了访问服务器而执行的一系列关于协议的操作:
1)客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
2)在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3)客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4)客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
网络通信中,数据从上层到下层交付时,要进行封装;同理,当目标主机接收到数据时,数据由下层传递给上层时需要进行拆封,这就是数据的封装与拆封。 数据的封装过程如下图19所示:
当用户发送数据时,将数据向下交给传输层,但是在交给传输层之前,应用层相关协议会对用户数据进行封装,譬如MQTT、HTTP等协议,其实就是在用户数据前添加一个应用程序头部,这是处于应用层的操作,最后应用层通过调用传输层接口来将封装好的数据交给传输层。传输层会在数据前面加上传输层首部(此处以TCP协议为例,图中的传输层首部为TCP首部,也可以是UDP首部),然后向下交给网络层。同样地,网络层会在数据前面加上网络层首部(IP首部),然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部(此处使用以太网接口为例,对应以太网首部),然后将数据交给网卡。 最后,由网卡硬件设备将数据转换成物理链路上的电平信号,数据就这样被发送到了网络中。这就是网络数据的发送过程,从图中可以看到,各层协议均会对数据进行相应的封装,可以概括为TCP/IP模型中的各层协议对数据进行封装的过程。
以上便是网络数据的封装过程(报文->段->包->帧),当数据被目标主机接收到之后,会进行相反的拆封过程,将每一层的首部进行拆解最终得到用户数据。所以,数据的接收过程与发送过程正好相反,可以概括为 TCP/IP 模型中的各层协议对数据进行解析的过程。
至此,对网络通信的学习暂时告一段落,当然后续可能会陆续更新内容,毕竟网海无涯(对本人而言),这两篇文章也是以总结扫盲,系统性学习为主。本人在学习总结过程中网上查阅了很多资料,得以看到很多新的知识,很多迷惑得到了解答,行文可能比较基础啰嗦,实在是各位前辈的作品太多“奇珍异宝”,能够从中取经倍感荣幸。也在B站上看了一些相关教学视频,其中“技术宅天蓝”博主的计算机网络常识专栏视频和“技术蛋老师”的计算机网络专栏视频让我受益匪浅,对于网络小白来说是非常不错的入门学习资源,在此分享给有缘学友。
视频中有很多精华内容(大约六千字)也被摘抄至这两篇文章中,这是我第一个fan的功劳,跟她一起做一件事会很开心,这篇博客在思念中完成,此刻尤甚。