OSI数据链路层上的协议有Ethernet/IEEE802.3/IEEE802.4/IEEE802.5、 ARP、RARP等。

1、Ethernet(以太网)

链路层支持很多协议,比如Ethernet、IEEE802.3、IEEE802.4、IEEE802.5等,使用哪种协议取决于网络所使用的硬件。

TCP/IP使用Ethernet以太网来作为LAN局域网上的技术,它采用一种称作CSMA/CD(带冲突检测的载波侦听多路接入)的媒体接入方法,标准以太网的传输速率为10Mbps,以太网帧格式如下:

IEEE802.3:以“以太网”为技术原形,本质特点是采用CSMA/CD 的介质访问控制技术的网络.IEEE802.3与Ethernet略有区别,但在忽略网络协议细节时,人们习惯将IEEE 802.3称为Ethernet。IEEE802.4针对令牌总线网络,IEEE802.5针对令牌环网络。

2、MAC地址

MAC地址就是物理地址,它由二层数据链路层负责,以太网帧头的源地址和目的地址就是指MAC地址。一块网卡对应一个MAC地址,MAC地址使用6个字节来表示,它是由IEEE管理的,每个MAC地址都是全球唯一的。两台主机通信,最终是通过网卡将数据发送给对方的,所以知道目的主机的MAC地址很重要。

3、ARP、RARP

ARP是地址解析协议,它可以根据主机内网IP地址获取其MAC地址,在IPV6中使用NDP来代替ARP。ARP工作在局域网内,当数据从WAN发送到路由器、局域网内两台同网段的主机收发数据、局域网内两台不同网段的主机收发数据 等情况都会使用ARP协议。

①:局域网内两台同网段的主机收发数据:每台主机(包括路由器)都会维护一个ARP缓存表,上面保存了IP地址和MAC地址的映射关系。当源主机向目的主机发送数据的时候会在ARP缓存表里根据目的主机IP地址查询其MAC地址,如果查到的话就将数据中MAC地址填充,然后发给目的主机。如果在ARP缓存表中没有找到目的主机的MAC地址则会向本地网段发起一个ARP请求的广播数据包,收到广播包的目的主机同样会将源主机MAC地址写入自己的ARP缓存表中,然后发回一个ARP应答包,里面包含了目的主机的MAC地址,其他非目的主机会忽略该ARP广播。这样源主机就得到了目的主机的MAC地址,然后将它写入ARP缓存表中,这样就可以向目的主机发送数据了。

②:局域网内两台不同网段的主机收发数据:比如源主机位于192.168.0网段,目的主机位于192.168.1网段。源主机向目的主机发送数据时需要通过ARP获得目的主机MAC地址,而这时发现目的主机不在同一网段内,需要使用默认网关(路由器),源主机同样通过发送ARP广播获得默认网关的MAC地址,然后源主机将默认网关MAC地址填充到数据报并发送给网关,网关收到数据后通过检查目的IP地址发现不是给自己的,所以要对数据进行路由,根据它的路由表继续做转发,通过ARP协议获得另一个路由器的MAC地址,然后将目标路由器MAC地址写入数据报发给目标路由器,目标路由器收到数据后通过检查IP地址发现目标主机位于本网段中,然后它同样通过ARP协议获得目标主机的MAC地址,将目标主机MAC地址写入数据报并发送给目标主机。

③:当数据从WAN发送到路由器:路由器通过NAT获得目标主机的内网IP,然后通过ARP协议获得目标主机的MAC地址,将MAC地址填入数据报后发往目标主机。

ARP欺骗:A发送广播请求C的MAC地址,而B收到广播后冒充C进行回应(ARP应答数据中目的IP地址为C而MAC地址为B),A收到回应后会认为B就是C。

RARP是反向地址转换协议使只知道自己硬件地址的主机能够知道其IP地址,这种主机往往是无盘工作站,因此RARP协议目前已很少使用。

4、MTU

MTU(Maximum Transmission Unit)称为最大传输单元,它跟链路层协议有着密切的关系,对于以太网传输来说,由于其电气方面的限制,每个以太网帧的大小都有最大1518bytes和最小64bytes的限制,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。由于以太网最大的数据帧是1518Bytes,刨去其帧头14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。

因为有MTU这个限制,所以网络层的IP协议负责检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理,这就是所谓的“IP分片”,分片最大的坏处就是降低了传输性能。

如果应用使用的是TCP协议的话,那么分片的工作就由TCP协议处理了,因为TCP协议中有MSS(最大分段大小)来进行类似IP协议中这种检查,这就是“TCP分段”。下面这张图解释了MTU和MSS的关系,可以看出来MSS最大为MTU(1500)-IP头长度(20)-TCP头长度(20) = 1460:

为什么有了“IP分片”还会有“TCP分段”?这是因为如果IP层分的某一片数据丢失了,由于TCP不知道也不关心IP层分片的细节,所以保证可靠性的TCP协议会对整个数据包进行重传,所以TCP会加入MSS来避免IP层的分片,而UDP协议不保证可靠性,所以它可以直接使用IP层的分片。

TCP/IP协议(3):数据链路层的更多相关文章

  1. 读书笔记——网络编程与开发技术(3)基于TCP/IP协议的网络编程相关知识

    TCP/IP协议:数据链路层,网络层,传输层,应用层. IP地址分为5类:A类.B类.C类.D类.E类. (A类.B类.C类是基本类,D类多用于多播传送,E类为保留类.) "*"表 ...

  2. OSI七层模型详解 TCP/IP协议

      总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...

  3. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  4. TCP/IP协议(一)网络基础知识

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  5. HTTP协议—— 简单认识TCP/IP协议

    大学没读计算机专业,所以很多的专业知识都不知道.既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到.高楼大厦,起于平川.不积跬步,无以至千里,不积小流,无以成江海.我现 ...

  6. TCP/IP协议学习笔记

    计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...

  7. TCP/IP协议基础(转)

    转自 http://www.chinaunix.net 作者:Bernardus160  发表于:2003-12-03 17:33:15 TCP/IP协议基础 -------------------- ...

  8. TCP/IP协议(一)

    TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协 ...

  9. TCP/IP协议 HTTP协议

    TCP/IP协议 OSI传统的7层参考模型:物理层,数据链路层,网络层,传输层,话路层,表示层和应用层.而TCP/IP协议并不完全符合这7层参考模型,它只采用了其中的应用层,传输层,网络层和数据链路层 ...

  10. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

随机推荐

  1. Chrome控制台格式化输出

    一 格式化输出文字 console.log('%c你好','color:green;'); console.log('%c你好%c啊','color:green;','color:blue;'); 二 ...

  2. java_5.1 for循环

    1.求1-100的和 public static void main(String[] args) { int sum = 0; for (int i = 0; i <= 100 ; i++) ...

  3. LIS LCS 最长上升子序列 最长公共子序列 ...

    最长上升子序列,问题定义:http://blog.csdn.net/chenwenshi/article/details/6027086 代码: public static void getData( ...

  4. Solidity语言基础 和 Etherum ERC20合约基础

    1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的,  小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...

  5. shell 脚本编写基础

    在进行Linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行 ...

  6. ---转载---phython资料

    整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何编程问题请第一时间到此网站查找. https://st ...

  7. Centos7上安装docker及使用scrapy-splash

    下载docker  https://www.cnblogs.com/yufeng218/p/8370670.html 安装scrapy-splash  https://www.cnblogs.com/ ...

  8. Java并发-volatile的原理及用法

    Java并发-volatile的原理及用法 volatile属性:可见性.保证有序性.不保证原子性.一.volatile可见性 在Java的内存中所有的变量都存在主内存中,每个线程有单独CPU缓存内存 ...

  9. SDK Manager 基础下载

    双击SDK Manager打开Android SDK Manager. 全选以下几项 创建新项目 更改gradle的地址: 更改app的build.gradle: android { buildToo ...

  10. js generator

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. generator跟函数很像,定义如下: function* foo(x) { y ...