当今IP网络数据通信的基本就是TCP/IP参考模型|pc访问web服务器的数据通信( 二 )


其中源地址填写的是PC自己的IP地址192.168.1.1 , 目的地址存放的是Server的IP地址192.168.2.1 , 而协议号字段则存放的是值6 , 这个值是一个众所周知(Well-Known) , 也就是行业约定的值 , 该值对应上层协议类型TCP , 表示这个IP头后面封装的上层协议为TCP(形象点的描述是 , 协议字段用于表示这个IP信封里装的是一个TCP的内容) 。 搞定之后 , 这个数据被交给下一层处理 。
当今IP网络数据通信的基本就是TCP/IP参考模型|pc访问web服务器的数据通信
文章图片
4.为了让这个IP数据包能够在链路上传输(从链路的一个节点传到另一节点) , 还要给数据包封装上一个数据链路层(第2层)的头部 , 以便该数据能够在链路上被顺利传输到对端 。
由于PC与R1之间为以太网链路 , 因此上层来的IP数据包被封装一个以太网的数据帧头(再增加一个信封) 。
这个帧头中写入的源MAC地址为PC的网卡MAC , 那么目的MAC呢?
PC知道 , 数据的目的地是192.168.2.1这个IP , 而本机IP是192.168.1.1/24 , 显然 , 目的地与自己并不在同一个IP网段 , 因此需要求助于自己的默认网关 , 让网关来帮助自己将数据包转发出去 。
那首先得把数据转发到网关吧?因此目的MAC地址填写的就是网关192.168.1.254对应的MAC地址 。 但是初始情况下 , PC可能并不知晓192.168.1.254对应的MAC地址 , 所以 , 它会发送一个ARP广播去请求192.168.1.254的MAC , R1的GE0/0/0口会收到这个ARP请求并且回送ARP响应报文 。 如此一来PC就知道了网关的MAC , 它将网关MAC0018-0011-0001填写在以太网数据帧头部的目的MAC地址字段中 。
另外 , 以太网数据帧头的类型字段写上0x0800这个值 , 表示这个数据帧头后面封装的是一个IP包 。 费了好大劲儿 , 这个数据帧(Frame)终于搞定了 , 如下图所示:
当今IP网络数据通信的基本就是TCP/IP参考模型|pc访问web服务器的数据通信
文章图片
5.事实上在物理链路中传输的是比特(bit)流 , 最终这个以太网数据帧变成了一堆的10101001从传输介质中传到了路由器R1上 , 如下图所示:
当今IP网络数据通信的基本就是TCP/IP参考模型|pc访问web服务器的数据通信
文章图片
6.R1在收到一串的比特流01010后 , 先将他们还原成数据帧(如下图所示) 。
当今IP网络数据通信的基本就是TCP/IP参考模型|pc访问web服务器的数据通信
文章图片
之后会检查一下数据帧在传输过程中是否有损坏 , 如果没有损坏 , 那么就解析数据帧头部中的目的MAC地址 , 确认目的MAC地址是不是自己接口GE0/0/0的MAC , 如果是就接收并且继续处理 , 如果不是就丢弃 。
在这里可以看到目的MAC就是接口GE0/0/0的MAC , 于是继续查看数据帧头部的类型字段 , 发现是0x0800 , 从而知道里头装的是一个IP包 , 接着它将以太网帧头剥去 , 或者说解封装 , 然后将里面的数据移交给上层的IP协议继续处理 。
7.接着由R1的IP协议栈接着处理这个报文 。 它会先校验一下数据在传输过程中IP报文有没有受损 , 如果没有 , 它就查看IP头中的目的IP地址(如下图所示) 。
当今IP网络数据通信的基本就是TCP/IP参考模型|pc访问web服务器的数据通信
文章图片
结果发现目的IP地址为192.168.2.1 , 并不是自己的IP地址——原来这个数据包是发给别人的 , 于是它开始拿着目的地址192.168.2.1到自己的路由表里去查询 , 看看有没有到192.168.2.1这个目的地的路由 , 结果发现有 , 并且这个路由条目指示它把数据包从从GE0/0/1口送出去 , 并交给192.168.12.2这个下一跳IP地址 。
于是它不再继续拆开IP头看里头的东东了 , 而是将IP数据包往下交还给数据链路层去处理 。