背景

这一系列的文章主要是为一般的、非专业开发岗位(如移动端)的工程师准备,一方面可以对网络的基本知识有基本的了解,另一方面不至于面试中被问到相关问题时束手无策。知识以 TCP/IP 协议簇为主,也会有应用层和数据链路层的简单介绍。

文章内容不会很难,也不会过多讨论各种算法,目标是以最快的速度达到最深的理解。内容肯定比直接百度搜索“TCP/IP协议”,然后随便看一篇文章要丰富得多,但也不足以让读者凭此就能胜任网络开发的工作。

诚然,面试以 TCP/UDP/HTTP 等协议为主,IP 协议都涉及甚少,更遑论数据链路层等。但我希望可以从原理上理解那些问题,而不是临时抱佛脚,背了一些答案然后在面试后忘干净。不要为面试而准备面试,为了完善自己的知识体系而准备。如果你觉得这正是你需要的,Let's Begin!

OSI七层模型和协议

在这一节中,我们不谈这些层和协议的具体作用,目前只要知道 OSI 模型中,网络被分为七层,由底层向高层依次是:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。

协议是一个 Big 很高,出现很频繁的词。其实它很好理解,它实际上是一种通信双方共同遵守的规范。比如我需要把性别和年龄传递给另外一台主机,那么我可以定义一个"A 协议",协议规定数据的前 4 个字节表示性别,后四个字节表示年龄。这样对方主机接收时就知道前 4 个字节是性别,而不会错把它当成年龄来处理。

整个互联网世界能够运行,完全得益于各个软件、硬件厂商严格遵守现有的协议。以 IP 协议为例,你可以随便修改它,然后自己弄出一个 IP2 协议,只不过没有人认可、遵守这个协议,所以它毫无用武之地。

物理层

物理层处于 OSI 七层模型的最底端,它的主要任务是将比特流与电子信号进行转换。

在计算机的世界中,一切都由 0 和 1 组成。你看到的这篇文章,在通过网络传输到你电脑的过程中,自然也是以 0 和 1 的形式存在。但是网络传输的介质(比如光纤,双绞线,电波等)中显然是不存在 0 和 1 的。比如在光线中,数据通过光的形式传递。0 和 1 以光的亮灭表示,其中的转换由物理层完成。

如果没有物理层,由 0 和 1 构成的比特流就无法在物理介质中传播。

数据链路层

数据链路层处于 OSI 七层模型的第二层,它定义了通过通信介质相互连接的设备之间,数据传输的规范。

在数据链路层中,数据不再以 0、1 序列的形式存在,它们被分割为一个一个的“帧”,然后再进行传输。

数据链路层中有两个重要的概念:MAC 地址和分组交换。

MAC地址

MAC 地址是被烧录到网卡 ROM 中的一串数字,长度为 48 比特,它在世界范围内唯一(不考虑虚拟机自定义 MAC 地址)。由于 MAC 地址的唯一性,它可以被用来区分不同的节点,一旦指定了 MAC 地址,就不可能出现不知道往哪个设备传输数据的情况。

分组交换

分组交换是指将较大的数据分割为若干个较小的数据,然后依次发送。使用分组交换的原因是不同的数据链路有各自的最大传输单元(MTU: Maximum Transmission Unit)。不同的数据链路就好比不同的运输渠道,一辆卡车(对应通信介质)的载重量为 5 吨。那么通过卡车运送 20 吨的货物就需要把这些货物分成四部分,每份重 5 吨。如果运输机的载重量是 30 吨,那么这些货物不需要分割,直接一架运输机就可以拉走。

以以太网(一种数据链路)为例,它的MTU是 1500 字节,也就是通过以太网传输的数据,必须分割为若干帧,每个帧的数据长度不超过 1500 字节。如果上层传来的数据超过这个长度,数据链路层需要分割后再发送。

以太网帧

我们用以太网举例,介绍一下以太网帧的格式。

以太网帧的开头是“前导码(Preamble)”,长度为 8 字节,这一段没什么用,重点在于以太网帧的本体。

本体由首部,数据和 FCS 三部分组成:

自学过程

类型部分存储了上层协议的编号,比如上层是 IP 协议,则编号为 0800。

FCS 表示帧校验序列(Frame Check Sequence),用于判断帧是否在传输过程中有损坏(比如电子噪声干扰)。FCS 保存着发送帧除以某个多项式的余数,接收到的帧也做相同计算,如果得到的值与 FCS 相同则表示没有出错。

交换机

交换机是一种在数据链路层工作的网络设备,它有多个端口,可以连接不同的设备。交换机根据每个帧中的目标 MAC 地址决定向哪个端口发送数据,此时它需要参考“转发表”

转发表并非手动设置,而是交换机自动学习得到的。当某个设备向交换机发送帧时,交换机将帧的源 MAC 地址和接口对应起来,作为一条记录添加到转发表中。

下图描述了交换机自学过程的原理

自学过程

关于数据链路层,最重要的一点还是它的定义:“通过通信介质相互连接的设备之间,数据传输的规范”。这说明数据链路层的协议适用于处于同一种数据链路两端的节点。如果不能理解这一点,就无法理解网络层和 IP 协议。

数据链路层的意义在于,如果没有数据链路层,数据只能以流的形式存在与通信介质中,不知道该发送往哪里,过长的数据流可能无法在通信介质中传输。

文/bestswifter(简书作者)
原文链接:http://www.jianshu.com/p/f16d7f3c8d5f
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

TCP/IP(一):数据链路层相关推荐

  1. 接收二进制数据_漫话TCP/IP:数据链路层-以太网(1)

    序言 TCP/IP中对于数据链路层及以下部分(物理层)未作定义.因为TCP/IP以这两层的功能是透明的为前提.然而,数据链路的知识对于深入理解TCP/IP与网络起着至关重要的作用.本篇文章我们主要介绍 ...

  2. TCP/IP协议数据链路层

    目录 一.数据链路层和网络层的关系 二.以太网 1.以太网格式 2.认识MTU 三.ARP协议 1.ARP协议的作用 2.ARP协议的工作流程 3.ARP数据报的格式 4.思考:浏览器中输入url后, ...

  3. Python Web学习笔记之TCP/IP协议原理与介绍

    HTTP.FTP.SMTP.Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从 ...

  4. TCP/IP的原理与介绍

    HTTP.FTP.SMTP.Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从 ...

  5. 网络编程-----OSI七层模型、TCP/IP模型

    OSI网络七层模型以国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系为参考模型,不仅包括一系列抽象的术语或概念,也包括具体的协议. 每一层实现各自的功能和协议,并完成与相邻层的接 ...

  6. TCP/IP详解--学习笔记(2)-数据链路层

    数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RARP请 求和接收RARP应答 ip大家都听说过.至于ARP和RARP,ARP ...

  7. TCP/IP协议(3):数据链路层

    OSI数据链路层上的协议有Ethernet/IEEE802.3/IEEE802.4/IEEE802.5. ARP.RARP等. 1.Ethernet(以太网) 链路层支持很多协议,比如Ethernet ...

  8. TCP/IP详解学习笔记(2)-数据链路层

    数据链路层有三个目的: ·            为IP模块发送和 接收IP数据报. ·            为ARP模块发送ARP请求和接收ARP应答. ·            为RARP发送R ...

  9. 《TCP/IP详解》学习笔记(二):数据链路层

    数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RARP请 求和接收RARP应答 ip大家都听说过.至于ARP和RARP,ARP ...

最新文章

  1. 推荐给大家看的设计书
  2. SAP S4HANA Buiness Partner名词解析
  3. prepare 和 row_count()一起使用的误区
  4. C# 线程的定义和使用
  5. gbase 8s oracle,GBase8s 查看数据库表空间信息
  6. 回调机制在 Android 监听用户界面操作中的体现
  7. SQL Server事务日志备份,截断和缩减操作
  8. SQOOP 导出Hive数据到MySQL
  9. lombok标签_微服务之:springboot入门、Swagger、Lombok使用
  10. 湖南2021年高考成绩查询与录取查询课件,@所有高考生,高考成绩和录取动态查询方式公布...
  11. php mysql异常捕获_PHP中try{}catch{}的用法及异常处理.对数据库的事物支持
  12. 计算机网络网络层之IP协议(5)——IP子网划分与子网掩码
  13. 第一次面试且失败的经历
  14. 【原】Python基础-__init__
  15. windows下sakai配置过程
  16. Android 增强版百分比布局库 为了适配而扩展
  17. cad怎么画立体图形教学_CAD怎么画三维图形? cad绘制立体的室内装修图的教程
  18. java8时间转换函数学习,教你脱离jdf转换的痛苦
  19. 查询收尾、带子查询的数据更新、视图 4.12数据库课程实验
  20. jQuery+Ajax+PHP无刷新分页

热门文章

  1. spring timetask 定时任务调度
  2. spring mail 发送邮件
  3. cygwin安装skyeye 所需的软件包列表
  4. 让Dock即时自动显示和隐藏程序坞不再延迟
  5. opencv 创建图像_非艺术家的图像创建(OpenCV项目演练)
  6. 夫妻两一个两年内3张卡9次逾期,一人4次,还能办理房贷吗?
  7. 如何快速把借呗额度提高到10万?
  8. 关于某公司冒充InfoQ中文站举办活动的声明
  9. 恐怖小说之王——斯蒂芬·金 (转贴)
  10. python找到字符中空格所在的位置_Python 查找字符在字符串中的位置示例效果