我们以使用浏览器访问一个网站这个场景,来分析和梳理TCP/IP网络的通信过程。

TCP/IP简述

1.TCP/IP包含了各种网络通信协议的协议簇,定义了互联网通信过程的标准。

2.TCP/IP通信模型设计为四个层级,由上到下分别是:应用层、传输层、网络层、网络接口层。

3.既然是协议簇,自然就包括了各种协议,且每个协议属于通信模型的不同层级。事实上,网络通信的过程就是各协议协同工作的结果。

TCP/IP网络通信基础_tcp/ip

常用协议简介

1.应用层协议:

http/https:超文本传输协议,用来访问在WWW服务器上的各种页面。https是在http的基础上增加了安全性。

SMTP/POP3/IMAP:电子邮件协议,用于电子邮件的发送接收。

DNS:域名解析协议,用于服务器域名到IP地址之间的转换。

2.传输层协议:

TCP:传输控制协议,为应用程序提供可靠的面向连接的通信服务。

UDP:用户数据包协议,提供无连接的尽力而为的通信服务。

3.网络层协议:

IP:互联网协议,IP协议用IP地址作为通信双方的标识,与路由协议协同工作,寻找将数据包传送到母的最佳路径。

ARP:地址解析协议,通过ARP表项记录IP地址与MAC地址的映射,在已知对方IP地址的情况下,通过ARP解析对方MAC地址

4.网络接口层协议:

ETHERNET II/802.3:以太网协议标准,以MAC地址作为通信双方的标识。

封装解封装

原始数据从源到目的会封装和解封装各层协议的报头从而实现通信。我们以域名解析为例简述这个过程:

浏览器输入https://www.sobot.com,浏览器和操作系统检查没有该域名对应的IP缓存,需要对域名进行解析。于是应用层DNS协议发送DNS请求报文,到传输层封装UDP报头,到网络层封装IP报头,到网络接口层封装Ethernet II报头,最后转换为光信号或电信号由主机的物理网卡发送出去。参看下图:

TCP/IP网络通信基础_网络通信基础_02

DNS服务器在收到该请求报文后,会一层一层解封装,直到获取DNS query里面的内容。同时该报文由源到目的经过的所有网络设备都会对报文进行封装和解封装,比如路由器会解封到网络层的IP报头,获取IP地址信息,然后再封装转发报文。

TCP/IP网络通信基础_tcp/ip_03

通信过程

当在浏览器输入一个网址,tcp/ip各层协议协同工作,使我们最终访问到目标网站,下面描述这个过程:

浏览器输入网站域名,假如浏览器查到了该域名IP地址的缓存,就会直接向该地址发起访问,无需经过DNS解析过程。(如对该过程感兴趣,可自行查找相关资料。)

然后是数据的封装过程:应用层协议是http,该协议对应传输层TCP协议的80端口,网络层封装源为本地网卡IP,目的为域名对应IP地址的IP报头,链路层封装源为本地网卡mac地址,目的为网关mac地址的以太网帧头。下图为一个http报文的封装:

TCP/IP网络通信基础_tcp/ip_04

为什么目的mac是网关mac地址?因为主机发现目的IP和自己网卡的IP不在同一网段,也就说明该报文不在局域网内发送,于是要交给网关处理。那么主机是怎么知道网关的mac地址呢?网关IP地址在网卡中已经配置不必多说,mac地址的获取就要用到ARP协议了。ARP协议通过ARP表记录了IP地址与MAC地址的映射关系。那么ARP表是怎么产生的呢?交换机通过MAC地址表记录了主机网卡mac与交换机相连接口的映射,当然也有网关mac与接口的记录。主机当前知道网关IP但不知道网关MAC,于是广播发送ARP请求,局域网内都可收到该请求,但只有网关会向该主机单播回复ARP响应,响应报文中包含网关的mac地址。而在这个过程中,交换机通过MAC地址表记录了主机网卡mac与交换机相连接口的映射,当然也记录了网关mac与交换机接口的映射,同时,主机和网关都获得了对端IP和MAC的映射,也就是ARP表项。下图为ARP请求网关mac的报文:

TCP/IP网络通信基础_tcp/ip_05

上面描述的ARP解析是局域网内的通信过程。接下来,网关收到报文后,会进行跨网络的转发。通过解封装IP报头,获取报文的目的IP地址,然后查找路由表确定该报文的转发路径,最后经过各路由器的逐跳转发最终到达目的服务器。在这个过程中,经过的每台路由器都会查找路由表,确定报文发送的下一跳,目的mac地址也会在转发过程中变换为下一跳的mac地址。在实际的网络中,内部网络访问外网,通常要经过NAT协议将内网地址转换为公网地址访问到网站服务器,这个不在本文的讨论范围,简单了解即可。服务器在收到报文后,就是一个解封装的过程了,到达传输层,通过tcp 80端口确定要送给应用层的http。服务器回应的报文,又是封装解封装路由交换的过程,只是源目IP和源目MAC互换一下。以上就是主机通过浏览器访问网站获取信息的全过程。