这篇blog实际上就是对整个计算机网络学习内容的的一个总结和归纳,这里举个实际的例子,来尽可能的覆盖全学习到的一些知识,把这些知识都串联起来。首先描述下背景:
之前我在京东商城看中一个戴森吹风机想要在一周年的时候送给女朋友小郭,但是当时看的价格比较高,想要在20分钟后秒杀的时候再买于是 就把它放入到了购物车,然后在到时间后我登录后点击链接 https://www.jd.com/ 请求数据,发出请求到看到页面的整个过程是什么样的?
网络通信流程
互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。分层由高到低分别为:应用层、运输层、网络层、数据链路层、物理层。发送端从应用层往下走,接收端从物理层往上走
- 在请求的时候我的浏览器是发送端而京东服务器为接收端
- 在响应的时候我的浏览器是接收端而京东服务器为发送端
接下来分层次的探讨一下这个问题。
应用层
首先我在浏览器客户端发出了请求,请求携带了Cookie信息,而Cookie记录了SessionID,为一个标准的https请求:
那么这一层要做的最重要的事情就是域名解析,用域名服务器将域名解析为对应的标准IP地址。主机向本地域名服务器发起解析请求,本地域名服务器则采用迭代的方式按顺序去询问:根域名服务器【DNS域名服务器】->顶级域名服务器【COM域名服务器】->权限域名服务器【JD.COM域名服务器】,最后权限域名服务器告诉了本地域名服务器站点的IP地址【120.52.30.30】,本地域名服务器返回给了主机。
运输层
在拿到了主机地址【127.0.0.1】京东的服务器的IP地址【120.52.30.30】、运输层的HTTP协议端口【443】以及请求的应用层HTTP数据报文后,运输层的TCP协议将应用层HTTP数据报文按照顺序切割为多个运输层TCP报文段。准备进行可靠连接:
- TCP使用三次握手将通信双方的机器进行连接,当然数据传输完毕后要使用四次挥手断开连接
- TCP使用滑动窗口来保证每次传输都是有序可靠的
- TCP使用拥塞控制来保证发送的传输速率可控,防止接收方扛不住
建立好连接后就要开始进行数据传送了,这里需要做的就是配置好网关
网络层
每个运输层TCP报文段在传送的时候都会被加上IP的首部作为网络层IP数据报来进行传送,那么每个报文段需要被配送到哪个地址呢?这个由分组转发算法来决定,例如我的请求被转发到了华南区,到了华南区某个京东的机房里的一台服务器
而在确定好了下一跳要被转发到哪个路由器或者目的主机后,使用ARP地址解析协议来将逻辑的IP地址转化为实际的物理MAC地址,以上三层实现了虚拟地址到真实物理地址的转化,接下来就是真实物理地址的字节传递,上边部分可以归纳下:
数据链路层
明确了数据要传送到的实际物理地址后,网络层IP数据报被加上首部和尾部组装成了一个数据链路层PPP帧,通过数据链路层的传输,可以实现差错控制的透明传输,通常使用交换机来加快传输速率。
物理层
每一个数据链路层PPP帧在物理层均被解析为物理层二进制位码流,然后通过电信号、光信号或者无线信号来进行传输,这样整个数据就实现了交换。
这样整个流程就实现完成了,请求到达了京东的服务器,并且通过redis拿到了购物车信息,获取到了戴森吹风机,这个时候我下单购买了戴森吹风机,女朋友就很happy!
信件的传递
还想举个例子来聊聊在整个流程中我们传递的内容该怎么理解,举个例子:一个小区里(主机)里住着很多住户(不同的应用进程),各自有门牌号(端口号),现在一个叫万维网的用户要给远方的另一个小区(目标主机)里的万维网亲戚写信:
- 把信(HTTP请求报文)放到信封(端口号)里,并且告诉邮局对方的邮编(URL),接下来会有怎样的流程?
- 邮局拿到邮编后首先查表(DNS域名服务器)将其解析为对方小区的地址(IP地址),选择好双方的连接方案(运输层传输协议)。然后依据客户要求选择中国邮政EMS(提供TCP可靠分组交付),并且把信的三页纸分装到三个相同的信封包括:信封(TCP数据报)包括:(TCP数据报首部,保存源目的端口地址)+信纸部分(切割的HTTP请求报文段)
- EMS(TCP协议)承包了该客人的业务,它拿到客户的信后依据之前邮局对照表(路由表)里对应的(IP地址)把这封信放到一个包裹里(IP数据报)包括:包裹外壳(IP数据报首部,保存源目的IP地址)+完整的信(TCP数据报)。然后快递公司站点把包裹投递出去,经过服务站点的层层转发(使用了下三层:数据链路层,物理层)送到对应住户(进程)所在的小区(主机),因为只知道地址(IP地址),而不知道具体怎么过去,但是快递员认路(ARP协议)
送到所在小区后,快递员取出包裹,拿出信,对照着信封的格式送到了具体的住户家里,信件的传递也就是上三层的寻址过程。