前言
本文以小明在图书馆连接网线,并访问网页为例,剖析TCP/IP协议栈工作原理,让读者了解这神奇的计算机网络底层协议的作用。
获取本机的IP【DHCP】
当小明连上网线,通过以太网接口连上了学校的交换机,而校园网其实就是一个ISP(Internet Service Provider),提供DNS服务。
1. 小明笔记本连接网络并没有自己的IP,而IP是互联网的唯一标识地址。在图书馆局域网内,小明笔记本创建了DHCP请求消息,并且封装进UDP中,然后封装成IP数据报:
Source IP:0.0.0.0 Des IP:255.255.255.255 【广播专用地址】
Source port:68 Des port:67
2. IP同时也被封装进入以太帧中,具体如下:
Sou MAC: 本地MAC Des MAC:FF:FF:FF:FF:FF:FF【广播帧】
3. 交换机接收到广播帧,立马向所有输出链路转发消息
4. 局域网的路由器接收到了该帧,并对其进行解析,
frame→datagram→segment→DHCP请求Message,其中提取UDP信息属于多路分解
5. 路由器网关为192.168.0.1/24【192.168.x.x保留作为局域网地址】,所以通过CIDR的分配原则,路由器决定给用户分配192.168.0.108IP地址,这时候,DHCP ACK Message被封装进入UDP中。
Sou:IP 192.168.0.1 Des:IP:255.255.255.255 Ack也是广播来的噢
另外,DNS服务器的ip,网关ip,被分配的ip都是封装到
注意,24为子网掩码,子网内的IP与其相与,都是得到子网的IP,即192.168.0.x
6. 交换机通过自学习的功能,把之前转发的MAC映射表存储起来,这时候,帧直接在交换机中转发
7. 笔记本获得DHCP ACK消息,在UDP中的Bootstrap Protocol,获取了自己的IP地址,同时也知道DNS服务器的IP地址以及局域网网关的IP地址了
获取网关的MAC【ARP】
小明此时想浏览www.baidu.com网站查找点信息,小明便在浏览器上输入了url【注意,没有特别指明都是访问http的】。链路层传递帧需要知道目标的mac地址,而现在笔记本只知道网关的IP,所以,此时会先查找得到网关的MAC地址。ARP是有时间限制的,其请求跟http请求并不是因果关系,是独立开来的。
- 笔记本对外发送ARP查询消息
Sour MAC: 本地的 DesMac:FF:FF:FF:FF:FF:FF
Sour IP: 本地 DesIp:网关ip
【相当于广播,who has gateway ip?tell local ip~】 - 网关路由器回复ARP消息,并把其mac地址放在源mac中传输。当笔记本拿到消息,便自己维护ARP表。
获取目标IP【DNS】
- 笔记本通过UDP封装DNS请求消息,目标port为 53,并发送给网关路由器。
- 网关路由器,直接通过转发表选择校园网的路由器,并转发消息,校园网的所有路由器都会解析IP信息,获取des Ip结合自治系统内部选路以及自治系统间选路算法,来把IP数据报转发到DNS服务器。
- DNS服务器开始查DNS数据库中是否有该DNS映射记录,如果找到,则会立马通过UDP封装DNS reply消息,发送回局域网网关路由器。
- 局域网网关路由器,通过NAT地址转换技术,借助端口,将desIp定位到小明的笔记本。
- 笔记本收到DNS回复消息,此时便获取到了百度的ip地址。
目标ip为本地DNS服务器
DNS查找路径:
本地DNS服务器→根DNS服务器→TLD【Top-Level Domain】DNS服务器→权威【authoritative】DNS服务器
递归查找:一路查到底
迭代查找:返回给local DNS服务器
实际:递归+迭代,自己请求localDNS是递归查询,但本地分别向不同DNS服务器查询属于迭代查询
DNS报文信息
自治系统内部选路
RIP(Routing Information):
RIP通告报文被封装在UDP上,使用端口520
类似DV算法,每经过一个subnet记为1hop,选择hop最少的路径,每隔30s邻居会互相告知路径情况,超过180s 则会认为邻居死亡,该路径移除。
每个路由器维系到达邻居的跳数信息,最大跳数限制为15。
OSPF(Open Shortest Path First):
使用端口号89
类似LS算法,自行实现可靠信息传输,且实现Link-state广播
广播其连接状态每30min一次,不单单向邻居广播
自治系统间选路
BGP(BorderGateway Protocol)
唯一使用TCP作为传输层的路由协议
AS与AS之间的连接叫eBGP,AS内部连接叫iBGP,eBGP交换两端路由器的信息,并通过iBGP告知AS内的其他路由器的信息。
建立通信【TCP】
- 笔记本向百度的ip发送TCP SYN请求报文,此时,数据包信息如下:
传输:本地端口 目的端口:80
网络:本地IP 目的IP:百度的ip
链路:本地mac 目的Mac:网关路由器的MAC
seq=x; - 百度的服务器接收到SYN请求报文,便回复SYN ACK,其中ack号为SYN请求报文+1,即x+1,seq=y
- 笔记本接收到SYN ACK,便向百度服务器发送ACK,ack=y+1,seq=x+1,握手完成,开始数据传输。
浏览网页【HTTP】
- 笔记本向服务器发送HTTP get的请求报文信息。
- 服务器获取到笔记本的HTTP的请求报文,服务器便向笔记本发送TCP ack确认报文,来告诉笔记本已经收到请求。
- 服务器向笔记本发送HTTP response报文信息。
- 笔记本接收到response信息,便会向服务器发送ack确认信息。
1)http
浏览器解析HTTP超文本内容,小明就看到了闪亮亮的网页啦。
2)https
此时小明收到是code=302的重定向http响应报文到https:,于是,笔记本向百度服务器 443 端口请求建立TLS连接,首先经过TCP握手阶段,再通过TLS握手阶段,协商后再获取相应的数据。
注:直接输入https://网址,是会自动进行TLS连接,而不会采用普通的http协议,数据被加密在SSL上,而SSL封装在TCP内。
TLS握手:
总结
网页的请求访问,涉及了TCP/IP协议栈的各个方面,在共同的作用下,完成一次完整的会话,核心过程如下:
1. 获取本机IP【UDP封装DHCP】
2. 获取网关MAC【ARP】
3. 获取域名映射的IP地址【UDP封装DNS】
4. 建立连接,获取数据【TCP三次握手,TLS握手,HTTP协议】
各层所用协议:
应用层:DNS,DHCP,HTTP,RIP,OPSF,BGP
传输层:TCP,UDP
网络层:IP
链路层:ARP