首先我们知道:描述一个网络中各个协议层的常用方法是使用
国际化标准组织(International Organization for Standardization , ISO)的
计算机通信开放系统互联(open systems interconnection , OSI)模型
在众多的数据链路中,使用最为广泛的是以太网,易于实现NIC(网卡)及驱动程序,当然还有其它的:(令牌环网,IEEE 802.3 )
传输层的主要有(TCP和UDP),可以看到网际协议中tcp/udp之间留有间隙,表明网络应用绕过传输层直接使用IPv4,IPv6是有可能的,着也就是所谓的原始套接字(raw socket)
网络层的协议(ICMP, IP, IGMP)
然而对于(ARP地址解析协议, RARP反向地址解析协议),我们习惯上把它们认为是链路层的协议,实际上,从分层的角度来看,更准确的说是,(应该是一种介于网络IP层与链路层之间的一种协议)
帧(frame):是数据链路层的单位
最大传输单元(MTU):Maximum Transmission Unit
以太网的最大传输数据长度是:1500字节
IEEE 802.3的最大传输数据长度是:1492字节
要了解以太网帧格式,首先我们必须知道
封装
不管是tcp/ip四层模型还是ISO/OSI模型:数据包传输的过程,会有不断加首部的过程,在传输层会加入(TCP或UDP首部),在网络层可能会加入(IP包首部),在链路层可能会加入以太网首部
解封
当通过电缆传递过来后,首先对以太网首部解析,识别上一层是IP包首部,则会将其继续发往上一层,交由网络层的ip协议继续进行解析,识别上一层是tcp首部(如果是udp的话,则交由传输层的udp协议进行解析,这也就是分用),则继续交由传输层的tcp协议进行解析,然后将数据传回应用层,完成通信
当加入了以太网首部之后:也就形成了一种特有的格式(以太网帧格式)
前导码(8个8位字节,由0,1数字交替组合而成,表示一个以太网帧的开始,也是对端网卡能够确保与其同步的标志)
前导码末尾有一个叫做SFD(Start Frame Delimiter),它的值是11,但是在IEEE 802.3中将最后8比特成为SDF
目标mac地址(6个字节):存放了目标通信对端的物理地址(即就是:mac地址)
源mac地址(6个字节): 存放了构造以太网帧发送端工作站的物理地址
类型(2个字节):常用的用三种(0800,0806,8035)
0800:表示通过ip协议
0806:表示通过ARP协议(将IP地址转换为mac地址)
8035:表示通过RARP协议(将mac地址转换为ip地址)
数据:48-1500(字节),对于以太网而言,传输数据帧,最大传输是1500个字节,最少是48个字节,不足48个时,补全48个字节
FCS(4字节): (Frame Check Sequence)是帧尾,称之为帧检验序列,检验帧是否有所破坏,通常在传输过程中,如果出现电子干扰,可能会出现发送数据导致乱码位的出现,我们可以通过这个进行检验,将错误的帧丢弃,这里保存着整个帧除以生成多项式的余数,在接收端也用同样的方法计算,如果得到的FCS相同,就判断接收帧正常
这里的RARP/ARP请求、应答占28个字节,PAD占8个字节
链路层识别存放的是mac地址(物理地址),网络层用的是ip地址(逻辑地址)
要实现通信,但是只知道目标主机的ip地址,形成的以太网格式中需要用到目标主机的mac地址,这时我们可以通过ARP协议,转化为相应的mac地址
当然,我们上面还提到了ICMP协议:它是传递差错,时间,回显,网络等控制数据(当上面通过ARP协议通过路由器轮转找不到对应的mac地址时,就会将错误的信息从服务端传回)
或者是当我们的数据报中,我们设置的是不分片,但是我们的数据量又大于传输的MTU,所以就会出错,通过ICMP协议返回
OSI模型的顶上三层被合并成一层,称为所谓的应用层,这就是Web客户(浏览器),Telnet客户,Web服务器,Ftp服务器等等,
为什么套接字提供的是从OSI模型的顶上三层进入传输层的接口??
1,顶上三层处理具体网络应用(FTP,Telnet, HTTP)的所有细节,却对通信细节了解很少,底下四层对网络应用了解不多,却处理所有的通信细节(发送连接,发送数据,等待确认,重发机制,校验和等等)
2,顶上三层通常构成了所谓的用户进程(user process),底下四层却通常作为操作系统内核的一部分提供。Unix与其他现代操作系统都提供分隔用户进程与内核的机制。由此可见,第四层,第五层之间的接口是构建API的自然位置。