1. 网络通信
通信/通讯需要具备两个基本的条件:
(1) 物理媒介(物理层面)
(2) 协议(软件层面)
网络协议。
2. 网络协议层次模型
互联网的本质是一系列的网络协议,处于互联网上的两台计算机如果要进行通信,就需要遵守这些
协议,就如同我们开车上路要遵守交通规则一样的。
简单来说,协议就是计算机之间通过网络实现通信时事先达成的一种“约定”。
这种“约定”:使那些不同厂商之间的设备,不同CPU以及不同操作系统组成的计算机之间,
只要遵守相同的协议就可以实现通信啦。
协议可以分为很多种,每一个协议都明确界定了它的行为规范,2台计算机之间必须能够
支持相同的协议,并且遵守相同的协议进行处理,才能实现相互通讯。
那么这些协议根据功能的不同分工不同我们划分为不同的层次,即每一个层次都有不同的功能
常见的划分:
<重点>
如图<OSI网络七层协议.png>较为详细的交代了不同层之间是如何组合和通信的。
发送方从最高层开始,从上到下按顺序传输数据,每一层接受到由上层处理的数据时,
添加该层的首部并可能会对数据进行处理,而接收方则将顺序反过来,从首层开始,
将数据的内容与该层对应的首部拆开,传输给上一层。
说白了,数据在发送是是数据从应用层到物理层的一个打包的过程,接收时是数据从物理层到
应用层的一个解包的过程。
各层的大体功能和作用,如下:
(1) 应用层
应用层是直接面向用户的程序或服务。
比如我们要发送数据是先由用户进程传递给应用层。
而接收数据也是由应用层直接呈现给用户进程。
应用层要完成用户希望在网络上完成的各种工作,因为用户可能对于发送数据有各种不同的
要求。
这一层可以想象成快递公司的收件员。
工作于这一层的协议接触的比较多的主要有:FTP/HTTP等。
(2) 表示层
表示层是为异种机通信提供一种公共语言,以便能进行互操作。常见的
协议有ASCII/SSL/TLS等。
如果是linux和window的两台异种机进行通信是不能直接进行通信的,
此时就需要表示层帮助我们去解决不同系统之间的通信语法问题。
数据的加密、压缩、打包等功能也在这一层完成。
(3) 会话层
会话层的作用就是建立或断开和管理应用程序之间的通信。
会话层可以把其看成是快递公司的调度员。
它管理者快递的相关信息,比如快递啥时候发过去,送这一单规定需要多少的时间等等。
它也要做同步管理,就好比我把东西运过去之后,但是那边没有人接受,那么这种情况
就是没有同步。
(4) 传输层 <重点>
传输层起着可靠传输的作用。
确保数据被可靠的传送到目的地址。
此层有两个具有代表性的协议:TCP 与 UDP
1. TCP:Transport Control Protocol传输层控制协议
它是一种面向连接的传输层协议,它能够提供高可靠性的通信。
就是说TCP协议是在确定对方能通信的情况下才会传输数据,如果对方不能通信
那么我们可能会一直发送请求,直至对方回应为止,一旦回应,那么通信双方
就建立连接,开始传输数据。
传输数据的过程中,有可能有数据丢失,一旦丢失,TCP就会继续重发。
比如:
我现在发了10000个包出去,另外一台接收方就要告诉我接收到了这10000个包。
如果丢了一些包,那么接受方就需要告诉发送方丢掉了哪些包。
那么发送方就会将丢掉的包重新再发一遍。
就能够高可靠性的保证对方完整无误的接收到我发送过去的数据啦。
所以,TCP协议是数据无误、数据无丢失、数据无失序、数据无重复到达的
通信协议,所以TCP协议一般是用于发送大量的数据。
2. UDP:User Datagram Protocol 用户数据报协议
它是不可靠的无连接的协议。
在数据发送前,因为不需要进行连接,所以可以高效率的数据传输。
TCP和UDP不太一样,UDP它不会去确认目标是否能够通信,它就只管往外发送数据
至于对方能不能够接受到数据,有没有丢包它一概不管。
UDP一般用于发送少量的数据。
这两种协议各有各有的好处,TCP更可靠与稳定,而UDP虽然没有那么可靠但是效率高。
所以现在应用的更多反而是UDP。
(5) 网络层
网络层负责将数据传输到目标地址。
这一层主要负责寻址和路由选择。主要的协议有:IP/ICMP两个协议组成。
网络层负责找出一条相对更加高效的链路将数据传递过去。
传输的地址使用的是IP地址。
IP地址和我们的住址实际上有点相像。
IP地址通过不断的去转发到更近的IP地址,最终可以到达目的地址。
如何去选择这条路,就看网络层。
(6) 数据链路层
互联设备之间传送和识别数据帧。
在链路层中,需要将比特流组合成字节的组合。
对数据进行处理封装成数据帧和传递、错误检测的层就是数据链路层。
(7) 物理层
它的最主要的作用是通过光信号或电信号传输比特流。
物理层所承载的就是实物。
如:将货物运往目的地的交通工具就是物理层。
物理层是七层模型中的物理基础,没有它就谈不上数据传输。
比如:网线、网卡(每一个网卡在出厂的时候设定一个全世界唯一的一个MAC地址,
一个48bits的数)。
3. 常用的网络设备
我们知道如果两台电脑通过网线直连的话是能够直接进行通信的。
此时这两台电脑就组成一个小小的局域网,局域网内只有两台通信设备。
但是这种使用场景非常少见,更常见的是多个设备之间互联,也就是说一个局域网内
可以有很多个通信设备。
但是问题是,一台计算机只有一个网口,怎么让一台计算机与另外多台计算机互联呢?
此时我们就需要用到交换机(switch)。
交换机:简单的来说,可以提供大量的网络端口将多台网络设备连接成一个局域网。
交换机内部拥有一根总线,交换机所有的端口都挂接到这条总线上面,也就意味着
多台网络设备只要通过接口连接到交换机上,那么这些网络设备从物理层面上来说,
就是互通的。
连接上同一个交换机上的网络设备如果要进行通信的话,那么可以使用广播的方式进行。
路由器:
路由器的功能是将不同的子网(局域网)之间的数据进行传递,我们把这个过程称之为寻址。
通过最终地址,在路由表上进行匹配,通过算法确定下一个转发地址。
这个地址可能是中间地址,也可能是最终到达的地址。
调制调解器(猫):
是调制器和解调器的缩写。
是一种硬件。
我们网络信号的传递大部分都是光信号/电信号(模拟信号),而计算机只能够识别数字信号(1/0)。
所以计算机从网络上接收到这些信息之后,需要将其翻译成计算机能够看懂的数字信号,
说白了,功能有点类似于AD DA转换。
网关:连接两个不同子网的门户
4. 网络数据的传输过程
分层传输、数据封装、拆包的过程。
注意:
有人说我们既然网卡都有一个唯一的MAC地址,或者说通过MAC地址就可以找到唯一的
一张网卡,那么通过MAC地址就应该能够可以实现任意一台主机和另外一台主机进行通信了
那么为什么还需要IP地址?
网络层负责IP地址。
数据链路层(或者TCP/IP模型中的物理层)负责MAC地址
以太网协议就依靠MAC地址发送数据的。
理论上,单单依靠MAC地址,上海的网卡就可以找到北京的网卡。
但是,这样做有一个很大的缺点。
以太网协议会以广播的形式发送数据,也就是说只要处于同一局域网的设备都会收到。
这样做,效率很低,而且广播方式只局限于发送者所在的子网络。
如果通信双方不在同一个子网络,广播是传不过去的。
如果传播到外网上去,互联网上的每一台计算机都会收到这个包,那么就会造成网络拥堵。
因此,必须要找到一种方式,去区分哪些MAC地址属于同一个子网络,哪些不是属于同一个
子网络。如果是处于同一个子网络,就采用广播的形式发送,否则就采用"路由"的形式发送。
导致了“网络层”的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机
是否属于同一个子网络。这套地址就叫做“网络地址”,简称“网址”。
在网络层出现之后,每台计算机有了两种地址,一种是MAC地址,另一种是IP地址。
MAC地址是由硬件(网卡)决定的,一般是不能改的。
IP地址由软件来决定的,是可以随意更改的。
所以,网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据报发送到
该子网络中目标网卡。
5. 互联网地址(IP地址)
IP地址:(Internet Protocol Address)网络协议地址
常见的IP地址有两类:
IPv4:32bits IPv6:128bits
目前为止应用更多的是IPv4,IPv6开始在教育网中开始大量使用。
理论上IPv4提供2^32个IP,IPv6能提供2^128个IP。
IPv4地址有32bits,这32个bits中各个bit的含义:
IPv4 32bits
网段号:
用来标识某个网段
比如处于同一路由器下的设备处于同一网段。
他们是能够直接通信的,
在IP地址连续的高位上。
主机号:
用来标识特定的网段中的特定的主机的。
在IP地址的连续的低位上。
如:
192.168.31.30(IP地址是以点分十进制的形式表示)
每8bits一个十进制数字,中间以 . 分隔开
网段号和主机号相加==32bits。
IP地址的分类:
类别 分段 IP地址的范围 私有地址范围
A 0 网段号(7bits) (主机号24bits) 0.0.0.0 ~ 127.255.255.255 10.0.0.0 ~ 10.255.255.255
B 1 0 网段号(14bits) (主机号16bits) 128.0.0.0 ~ 191.255.255.255 172.16.0.0 ~ 172.31.255.255
C 1 1 0 网段号(21bits) (主机号8bits)192.0.0.0 ~ 223.255.255.255 192.168.0.0 ~ 192.168.255.255
D 1 1 1 0 多播组号(28bits) 224.0.0.0 ~ 239.255.255.255
E 1 1 1 1 0 (留着以后用) 240.0.0.0 ~ 247.255.255.255
在设置IP地址时,一般需要设置另外一个称之为子网掩码的东西。
Netmask:子网掩码
就是用来指定一个IP地址中,哪些bits是网段号,哪些bits是主机号。
简单的来说,Netmask中为1是网段号,为0的是主机号。
Netmask:255.255.255.0
192.168.31.30
192.168.1.4 和 192.168.3.5 不是同一个网段
192.168.1.5 和 192.168.1.6 是处于同一个网段
并不是所有的子网掩码都是合法的。
255.255.114.0
1111 1111 1111 1111 1110 0010 0000 0000//不合法的
255.255.192.0
1111 1111 1111 1111 1100 0000 0000 0000//合法的
我们知道一台计算机可以拥有一个独立的IP地址,一个局域网也可以拥有一个独立的IP
地址(对外就好像只有一台计算机),对于目前广泛使用的IPv4,它的资源是非常有限的,
一台计算机一个IP地址是不现实的,往往是一个局域网才能拥有一个IP地址。
在因特网上进行通信的时候,必须要知道对方的IP地址。实际上数据包中已经附带了
对方的IP地址,把数据包发送给路由器以后,路由器会根据IP地址找到对方的位置,
完成一次数据的传递。
那么一个局域网往往才能拥有一个独立的IP.
IP地址仅仅只能够定位到一个局域网,无法定位到处于这个局域网内的哪台主机
那么我们就需要用到MAC地址。
其实真正能够唯一标识一台计算机的是MAC地址,MAC地址是在全世界都是唯一的。
MAC是固定的,在出厂的时候就已经设定好了的(一般是不可被更改的)。
局域网中的路由器/交换机会记录每台计算机的MAC地址。
数据包中除了会附带对方的IP地址,也会附带对方的MAC地址,当数据包到达局域网之后
路由器/交换机会根据数据包中的MAC地址找到对应的计算机,然后就把这个数据包
转交给计算机,这样就完成了数据的传递吗?
有了IP地址和MAC地址,虽然可以找到目标计算机,但仍然不能进行通信,
仅有IP地址和MAC地址,计算机虽然可以正确的接收到数据,但是却不知道
要将数据包交给那个网络程序(进程)来处理,所以通信失败。
为了区分不同的网络程序,计算机会为每一个网络程序都分配一个第一无二的端口号(Port Number)
6. 端口号
TCP和UDP采用16bits的端口号来表示网络程序。
网络应用程序从传输层的角度来看可以分为:
TCP应用
UDP应用
TCP的端口号和UDP的端口号是独立的。
所以一台上的网络应用程序由:
MAC地址 + IP地址 + 传输层协议(TCP/UDP) + 端口号 来确定。
端口号并不是说你想指定就指定的,由IANA来管理的。
比如:
ftp服务-->21端口
http服务-->80端口
....
端口号其实说白了就是一个0~65535的一个数字。
7. 网络字节序的问题
UDP/TCP/IP协议规定:
把接收到的第一个字节当做高位字节看待,这就要求发送端发送的第一个字节是高位字节。
网络字节序是大端字节序。