体系结构 & 协议
TCP/IP协议族是一个四层协议系统,自底向上分别是数据链路层、网络层、传输层和应用层
数据链路层
数据链路层主要处理数据在物理媒介上的传输,实现网卡接口的网络驱动程序,网络驱动程序为上层协议提供一个统一接口
数据链路层常用协议为ARP协议 & RARP协议,实现了网络IP地址和机器物理地址之间的相互转换。
网络层使用IP寻找机器,数据链路层使用物理地址寻找机器,因此网络层必须先将IP地址转化为物理地址,才能使用数据链路层的服务,这就要用到ARP;
RARP协议仅用于网络上的无盘工作站,无盘工作站无法记住自己的IP,因此需要利用网卡上的物理地址反向查询出自己的IP
网络层
网络上通信的两台机器往往不直接相连,而是通过层层路由器相连,因此网络层的任务就是选择经由哪些中间节点,确定通信线路,同时对上层协议隐藏网络拓扑连接的具体细节,因此上层协议看来,两台机器是直接相连的。
IP协议为每个数据包确定是直接发送给目标主机还是发给下一跳路由器,多次重复这一过程,最终到达目标主机,或者由于发送失败而被丢弃。
ICMP协议用于补充IP协议,ICMP协议使用的报文格式为:8位类型码,将信息分为差错(重定向、目标不可到达)和查询码(ping);8位细分码(进一步细分类型码);16位CRC校验码
传输层
传输层为应用程序封装了一条端到端的逻辑通信链路,负责数据的收发、链路和超时重连等
TCP协议为应用层提供面向连接,基于流的服务,通过超时重传、数据确认,确保每个数据都可靠的传输
UDP协议为应用层提供不可靠、无连接基于数据报的服务,当数据丢失,或接收端发现数据错误,UDP只通知应用程序“发送失败”,每个UDP数据报都有一个长度,接收端必须一次性将该长度单位读出,否则截断
应用层
没啥好说的
封装&分用
封装
应用程序在发送到物理网络之前,将自顶向下层层传递,在传递给下一层前,将会在头部和尾部加上本层的信息,以实现该层的功能
应用程序由用户自定义数据形式,这部分数据给到传输层,例如通过TCP封装后的数据称为TCP报文段,当发送端应用程序使用send()或其他函数向TCP连接写入数据时,内核中的TCP模块首先将这部分数据复制进内核发送缓冲区,TCP模块调用IP模块的服务传递TCP段;或者是UDP封装数据为UDP数据报,根据UDP特性在内核中有不同的操作
之后在网络层经过IP封装,称为IP数据报,包括IP头和数据,数据就是TCP数据报/UDP数据报/…
IP数据报经过数据链路层封装成 帧 ,例如以太网帧的形式为:6字节目的物理地址,6字节源物理地址,2字节类型,数据,校验码
至此封装完成
分用
当帧到达目的主机后,这个过程开始与封装相反,自底向上层层拆解,依靠头部类型信息字段来区分
以以太网帧为例,通过两字节类型字段来标识上层协议,分别交给IP、ARP、RARP协议来处理,如果是用IP协议,则继续通过IP数据报的头部16位协议字段来区分TCP协议还是UDP协议,之后TCP/UDP则通过头部16位端口号来区分上层应用程序,例如DNS端口号53,HTTP端口号80等,这样层层解析,将原始数据送至目标。
ARP
ARP协议实现任意网络层地址到物理地址的转换,例如从IP地址到mac地址
主机向自己所在的网络广播一个ARP请求,该请求包含目标及其它的网络地址,只有目标会ARP应答,并返回自己的物理地址
为了避免重复ARP,ARP协议会维护一个高速缓存,里面存放经常访问的例如网关地址和最近访问地址IP到物理地址的映射
例如我们抓取一个数据包,它的内容首先是源端物理地址:15:a5:4b:16:9c:49,目的端地址是ff:ff:ff:ff:ff:ff ,这表示以太网的广播地址,0x806表示ARP协议,以太网帧长42字节,还有4字节CRC码不统计,Request表示这是ARP请求,who has 192.168.1.109 tell 192.168.1.108,数据长28字节
抓取返回的数据包:内容首先是返回端物理地址:08:00:49:28:81:54,目的端地址是15:a5:4b:16:9c:49,,再用806表示ARP,以太网帧长60字节,Peply表示回应,192.168.1.109 is at 08:00:49:28:81:54
IP
当IP模块收到数据链路层的IP数据报时,首先对头部进行CRC校验,确认无误后进行具体分析
如果IP数据报头部设置了源站选路,则调用转发子模块来处理数据报,如果IP数据报头部目标地址正是本机地址,则直接交给上层分用,如果不是给本机的,也同样给转发子模块处理
转发子模块首先检测系统允不允许转发,不允许就丢弃这个数据,允许就在路由表里按照目标IP地址查下一跳在哪,具体步骤为:先看路由表中有没有目标IP完全匹配的主机IP地址,如果有直接用这个,如果没有,就用和目标IP有相同网路的IP,如果还没有,就用默认路由,跳到网关
这个路由表不断更新,由路由协议或者route命令不断调整路由表
|