最近这段时间一直在学习计算机网络方面的知识,今天书差不多算是看完了,所以想写一篇文章来给自己这段时间对于计算机网络的学习做一个总结吧。可能会显得很基础和啰嗦,主要是初学者,不要介意。
我们学生在学校经常会用自己的笔记本电脑来上网,比如想通过浏览器打开百度的主页,这个动作看起来很简单,其实背后蕴藏着很多的计算机网络方面的知识。
首先我们的电脑为了可以与外网通信,需要获得自己本机的IP地址;一台主机通常直接与一台路由器连接,该路由器即为该主机的默认路由器(default router),又称为第一跳路由器(first-hop router),每当某主机发送一个分组时,该分组就被传送给它的默认路由器,我们将源主机的默认路由器称为源路由器(source router),把目的主机的默认路由器称为目的路由器(destination router)。(所以一个分组从源主机到目的主机的选路问题显然可归结为从源路由器到目的路由器的选路问题。)所以我们的电脑为了可以与外界通信,也需要建立与自己的默认路的连接,此时需要获得自己默认路由器的地址;为了可以浏览网页,需要DNS域名服务系统,来把网页地址转换为该网页所在服务器的IP地址,为了获得DNS的服务,需要取得本地DNS服务器的地址。
我们的电脑首先运行的是DHCP(Dynamic host configuration protocol)--动态主机配置协议,DHCP协议使用的传输层协议是UDP,主机将DHCP请求经传输层UDP、网络层IP以及以太网中802.3协议的封装后的帧以广播的形式(目的地址是全1)发送到本地局域网中,然后本地局域网中的DHCP服务器接收请求,并发送一个DHCP响应给主机,响应包括分配给主机的IP地址,其默认路由器的IP地址,以及DNS服务器的名字和IP地址。如下图所示,是主机与本地DHCP服务器通信的示意图。
此时我们的电脑主机已经获得了自己的IP地址、默认路由器的IP地址以及DNS服务器的IP地址和名字。在我们发送HTTP请求的时候需要先获得网址:www.baidu.com所在服务器的IP地址,这样我们才可以跟该web服务器通信,发送HTTP请求。此时就需要运行DNS协议,向DNS服务器发送请求,当主机把DNS请求经UDP、IP封装成网络层的IP数据包以后,到链路层都是利用MAC地址而非IP地址在交换机、路由器等之间进行转发的,但是主机现在只知道DNS服务器的IP地址,而不知道DNS服务器的MAC地址,此时需要运行网络层的ARP(Address Resolution Protocol)-地址解析协议,根据IP地址获取物理地址(MAC地址)。而且在链路层中源和目的MAC地址都是相邻两个链路中适配器的MAC地址,所以主机利用ARP协议向整个局域网发出ARP请求的广播帧,然后默认路由器接收帧并把ARP响应帧回送给主机,ARP响应帧包括路由器接口的MAC地址。
此时主机算是知道了默认路由器的MAC地址,可以把DNS请求帧发送到默认路由器上。接着路由器从接收的帧中把IP数据包取出来,然后根据目的IP地址把该数据包从校园网发送到外网上,然后经过多个路由器的转发最终到达DNS服务器,路由器根据转发表来转发该数据包,其中的转发表是根据各种选路算法、选路协议来确定的,其中包括RIP,OSPF、IS-IS以及BGP等协议。DNS服务器一层层拆解数据包,最终得到DNS的请求,然后DNS服务器再回送一个DNS响应,响应含有域名www.baidu.com的web服务器的IP地址,然后也是相似的经运输层、网络层、链路层和物理层到达主机的默认路由器,最终到达主机。
当知道了web服务器的IP地址以后,主机就可以发送HTTP请求了,HTTP协议所使用的运输层协议是TCP,TCP连接建立需要三次握手,第一次握手:客户机到服务器的SYN、seq=x;第二次握手:服务器到客户机的SYN、ACK、ack=x+1、seq=y和第三次握手:客户机到服务器的ACK、seq=x+1、ack=y+1,客户机在第三次握手时就把数据发送给服务器了,此时TCP连接已经建立。
客户机把HTTP请求发送到TCP socket中,当包含该HTTP请求的TCP数据段到达web服务器以后,服务器回送一个带有HTTP响应(网页内容)的TCP数据段给主机,主机从TCP数据段中取出HTTP响应,然后交付给响应的socket端口,浏览器最终读取并解释和渲染该网页最终显示在主机屏幕上。