1.疑问

1 一台电脑是怎么把消息发给另外一台电脑的呢?
2 两台电脑啥线路也没有相连,怎么就能把消息发送给他呢?
3 世界上的电脑那么多,咋就能找到那台特点的电脑呢?有人说我们可以 MAC 或者 IP 来唯一标识啊,可是,我就有点疑惑了,世界那么大,电脑那么多,有了这个标识,我们该怎么找到他呢?遍历所有电脑?
4 多个程序同时发消息给一台电脑,电脑是如何准确把这些消息拿给这些不同程序的呢?
5 发送的消息丢失了怎么办?

通过以下的讲解我们来回答以上问题。

2.协议

首先来看计算机之间要相互通信,双方就必须基于相同的规则。比如,如何找到目标、如何进行通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。像这样把与互联网相关联的协议集合起来总称为 TCP/IP,TCP/ IP 是在 IP 协议的通信过程中协议族的统称。TCP/IP 协议族里重要的一点就是分层。接下来就看看我们的网络分层以及每一层的协议。

3.网络分层

网络分层是标准的七层,也就是我们所说的 OSI 七层模型。TCP/IP 五层模型和TCP/IP 四层模型是以 OSI 七层优化而来。

来看一张详细的

为什么要进行分层呢?
把 TCP/IP 层次化是有好处的。比如,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。把各层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了
值得一提的是,层次化之后,设计也变得相对简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方、对方的传输路线是怎样的、是否能确保传输送达等问题。

4.每层常见物理设备

在每一层详解之前,我们先看看每一层的物理设备有哪些?

5.每一层详解

我们针对OSI 七层模型进行讲解,这个是面试中常考的。

5.1物理层

物理层负责利用光缆、电缆、双绞线、无线电波等把两台计算机连起来,把计算机连接起来。在计算机之间主要是基于电器特性发送高低电压 (<mark>电信号</mark>)进行通信,高电压对应数字1,低电压对应数字0

5.2数据链路层

数据链路层由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思。

数据链路层的功能:定义了电信号的分组方式。

可以发比特流但是没有格式就会乱七八糟,于是就有了”帧”。采用了一种”帧”的数据块进行传输,为了确保数据通信的准确,实现数据有效的差错控制,加入了检错等功能。

1. 以太网协议

以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称之为。每一个桢由标头(Head)和数据(Data)两部分组成。

帧的大小一般为 64 - 1518 个字节。假如需要传送的数据很大的话,就分成多个桢来进行传送。
head包含:(固定18个字节)

  • 发送者/源地址,6个字节。
  • 接收者/目标地址,6个字节。
  • 数据类型,6个字节。

标头部分的字节是固定的,并且固定为18个字节。

data包含:(最短46字节,最长1500字节)

  • 数据包的具体内容

head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

把一台计算的的数据通过物理层和链路层发送给另一台计算机,究竟是谁发给谁的,计算机与计算机之间如何区分,你总得给他们一个唯一的标识吧?head中包含的源和目标地址由来:ethernet规定接入internet设备必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址

2. MAC 地址

连入网络的每一个计算机都会有网卡接口,每一个网卡都会有一个唯一的地址,这个地址就叫做 MAC 地址。计算机之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

3.广播:

有了MAC地址,同一网络内的两台主机就可以通信了(一台主机通过<mark>ARP协议</mark>获取另外一台主机的MAC<mark>地址</mark>

在同一个<mark>子网</mark>中,计算机 1 要向计算机 4 发送一个数据包,这个数据包会包含接收者的 MAC 地址。当发送时,计算机 A 是通过<mark>广播</mark>的方式发送的,这时同一个子网中的计算机 2, 3 也会收到这个数据包的,然后收到这个数据包的计算机,会把数据包的 MAC 地址取出来,与自身的 MAC 地址对比,如果两者相同,则接受这个数据包,否则就丢弃这个数据包。计算机4发现包含自己的MAC地址,于是就进行响应。

5.3网络层

我们所处的网络,是由无数个子网络构成的。广播的时候,也只有同一个子网里面的计算机能够收到。假如没有子网这种划分的话,于是就通过ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这就会使得整个网络奔溃。

必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,通过网关和路由向不同广播域/子网分发数据包

所以有了我们的网络层,它是处理分组在网络中的活动,比如分组的选路。
引入一套新的协议用来区分不同的广播域/子网,于是就有了IP 协议。

1. IP协议

IP协议,它所定义的地址,我们称之为IP地址。IP协议有两种版本,一种是 IPv4,另一种是 IPv6。我们目前大多数用的还是 IPv4,并且面试也重点考这个,所以我们来重点喵一下这个IPv6。

这个 IP 地址由 32 位的二进制数组成,我们一般把它分成4段的十进制表示,地址范围为0.0.0.0~255.255.255.255。

ip地址分成两部分

  • 网络部分:标识子网
  • 主机部分:标识主机

网络部分和主机部分所占用的二进制位数是不固定的。
注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网。

假如两台计算机的网络部分是一模一样的,我们就说这两台计算机是处于同一个子网中。例如 192.168.33.1 和 192.168.33.2, 假如这两个 IP 地址的网络部分为 24 位,主机部分为 8 位。那么他们的网络部分都为 192.168.33,所以他们处于同一个子网中。又例如:192.16.10.1与192.16.10.2并没有告诉你网络部分和主机部分各几位,所以不能确定二者处于同一子网。于是就有了子网掩码

<mark>子网掩码</mark> 它是表示子网络特征的一个参数,是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如上面的ip地址192.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

如何判断是否在一个子网中
是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

例如,192.168.33.1和192.168.33.2的子码掩码都为255.255.255.0,把IP与子码掩码相与,可以得到他们都为192.168.33.0,进而他们处于同一个子网中。

2. ARP协议

arp协议功能:广播的方式发送数据包,获取目标主机的mac地址。

有了IP协议,我们可以判断在一个一个子网中了,在一个子网中我们在链路层也讲过是通过MAC地址进行通信的,那我们现在只有目标的IP地址,如何才能拿到目标主机的MAC地址呢,这个时候又引出了ARP协议。

发送端主机通过广播的方式把自己的数据包发出去,所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己的mac。数据包格式如下:
<mark>数据包格式:(发送端的MAC地址,目标MAC地址,发送端IP地址,目标IP地址,数据)</mark>

3. ICMP协议

这个协议也经常考。让我们来了解一下。
为什么需要ICMP协议呢?一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。于是就有了ICMP协议。

ICMP协议的功能主要有:

  1. 确认IP包是否成功到达目标地址
  2. 通知在发送过程中IP包被丢弃的原因

我们需要注意几点:
1.ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议 。
2. ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6。

还记得我们平时的ping命令吗?其实就是用到了ICMP。

那么如何验证的呢?
(1)ping命令会先发送一个 ICMP Echo Request给对端
(2)对端接收到之后, 会返回一个ICMP Echo Reply
(3)若没有返回,就是超时了,会认为指定的网络地址不存在。

4.traceroute

traceroute也是基于ICMP协议实现的。
功能:
打印出可执行程序主机,一直到目标主机之前经历多少路由器。
注意:因为traceroute是路由器命令,在windows下应该是tracert命令。

5.4传输层

相比网络层的功能是建立主机到主机的通信。传输层的功能就是建立端口到端口的通信

通过物理层、数据链路层以及网络层的互相帮助,我们已经把数据成功从计算机1传送到计算机4了,可是,计算机B里面有各种各样的应用程序,计算机该如何知道这些数据是给谁的呢?通过端口(Port)。比如我们的熟知的8080。

补充:端口范围0-65535,0-1023为系统占用端口。

也就是说,只有有了IP和端口,我们才能进行准确着通信。这个时候可能有人会说,我输入IP地址的时候并没有指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。

也就是说,只有有了IP和端口,我们才能进行准确着通信。这个时候可能有人会说,我输入IP地址的时候并没有指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。

传输层最常见的两大协议是 TCP(Transmission Control Protocol,传输控制协议) 协议和 UDP(User Data Protocol,用户数据报协议) 协议,其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输
这里看一下连接过程https://mp.weixin.qq.com/s/Pw8v6sZy95DV_TQkS5Llbg

5.5会话层

会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。计算机收到了发送的数据,但是有那么多进程,具体哪个进程需要用到这个数据,则把他输送到那个进程。例如:如果80端口要用,所以系统内数据通信,将接收端口数据送至需求端口。还有就是会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信,即对信息的交互实现控制。这种能力对于传送大的文件极为重要。

5.6表示层

表示层的作用之一是为异种机通信提供一种公共语言,以便能进行互操作。现在正确接收到了需要的数据,但是因为数据在传输过程中可能基于安全性,或者是算法上的压缩,还有就是网络类型不同。那就得有一个沟通的桥梁来整理整理,还原出原本应该有的表示。例如,IBM主机使用EBCDIC编码,而大部分PC机使用的是ASCII码。在这种情况下,便需要会话层来完成这种转换。其他功能例如数据加密,数据压缩

5.7应用层

终于说到应用层了,应用层这一层最接近我们用户了。应用层是网络可向最终用户提供应用服务的唯一窗口,其目的是支持用户联网的应用的要求。由于用户的要求不同,应用层含有支持不同应用的多种应用实体,提供多种应用服务,如电子邮件(MHS)、文件传输(FTAM)、虚拟终端(VT)、电子数据交换(EDI)等。主要协议有,FTP(21端口),SMTP(25端口),DNS,HTTP(80端口).

应用层的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)

1.DHCP协议

DHCP(Dynamic Host configuration Protocol,动态主机配置协议 )是一个局域网的网络协议,使用UDP协议工作;统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。

主要有两个用途:
(1)用于内部网或网络服务供应商自动分配IP地址;
(2)给用户用于内部网管理员作为对所有计算机作中央管理的手段。

<mark>DHCP实现动态分配IP的功能,实现IP的时分复用,从而解决IP资源短缺的问题</mark>。
DHCP有三种机制分配IP地址:
1) 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
2) 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

2.DNS

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

就比如我们访问www.baidu.com 转化为 39.156.69.79

6.必学协议以及面试高频考点:

  • 1、http协议,包括:封装格式,常见响应码,不同版本的区别,常见请求方法,存在哪些安全隐患,啥是无状态协议等。
  • 2、https协议:http 是明文传输,https 是加密安全的,需要知道 https 是如何加密的、数字证书如何形成,啥的对称加密、非对称加密。
  • 3、TCP协议:三次握手、四次挥手、如何保证可靠传输、流量控制、拥塞控制。
  • 4、UDP:这个大致了解即可,好像内容比较少
  • 5、DNS、ICMP、ARP、DHCP
    推荐书籍:《计算机网络:自顶向下》、《图解http》

参考文章:

  • https://blog.csdn.net/yaopeng_2005/article/details/7064869
  • https://blog.csdn.net/baidu_37964071/article/details/80514340
  • https://mp.weixin.qq.com/s/Y3-CM6EiIX9saXn4U9yu1w


优质文章推荐

1.计算机网络----三次握手四次挥手
2.一篇让你彻底了解http请求报文和响应报文的结构
3.梦想成真-----项目自我介绍
4.一篇让你彻底了解HTTP 的前世今生
5.一篇让你彻底搞定HTTP方法与状态码
6.你们要的设计模式来了
7.震惊!来看《这份程序员面试手册》!!!
8.一字一句教你面试“个人简介”
9.接近30场面试分享