25. 网络编程之CS/BS架构、通信协议及原理

网络架构演变

1.单机架构

就是直接将资源下载到电脑,在电脑上直接使用,最典型的就是电脑上的单机游戏,还有就是电脑office办公软件

2. CS架构

C 是client,是用户安装的软件,S是server,统一管理数据库的主机中的软件,再后来服务端不只是管理数据,外加处理业务逻辑

无论是客户端还是服务端,本质上都是应用程序向操作系统请求使用硬件资源进行通信

比较常见的是我们使用的QQ,微信等软件

优缺点:

  • 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了

  • 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少

3. BS架构

B是browser,S是server,指的是浏览器和服务端的通信
实际上和CS架构类似 ,只不过客户端变成了用户电脑中的浏览器,度无端是各种网站,具体业务的处理根据相应协议和标准提供通用的服务器程序,在不同的服务器处理

我们能够使用浏览器访问的网页都是BS架构,例如京东,淘宝商城

互联网的组成

互联网访问简述

当我们打开浏览器,输入网址点击确认之后,便能直接获取网站资源,我们的操作很简单,但是实际上浏览器做了很多的工作:

  • 浏览器检查是否有缓存过域名对应IP地址
  • 如果没有缓存的域名对应的IP,请求域名服务器解析成对应的IP地址
  • 浏览器建立Socket连接,根据http协议组装get类型的http header,通过tcp/ip协议发送报文
  • tcp/ip协议会通过网络层网卡(wifi或网线)发射信号到家庭里面的路由器,家里的路由器发送信号到电讯厂商的交换机(中间可能会经过很多次的路由)找到目标服务器,服务器也许托管在IDC机房,也许在阿里云VPS,也许在国外
  • 机房里面会有大型交换机、机柜、专业的精密空调,你要访问的那台IP的服务器就在其中某个机柜中
  • 在服务器接收到信号后,会根据tcp/ip协议解出http协议头。根据get的请求决定需要返回的数据
  • 在服务器端实际上根据业务还有很复杂的逻辑;服务器后面还有许多台服务器,到底指定那台服务器来处理请求,需要负载均衡设备来完成
  • 要返回的数据是在缓存里面、还是在静态文件中、还是在数据库(如MySQL,Oracle)中
  • 浏览器根据返回的数据,发现有一些静态资源(如CSS,JS,图片等)时有重新发起新的http请求,而这些静态资源文件可能在CDN网络中,请求静态资源的整个过程需需要从第一步重新再走一遍,并且很可能中间经过的交换机,路由过程是不一样的

image

image

4. 互联网通信协议

网络的存在就是为了实现跨地域的数据传输,即通信

网络的实现需要两部分,一是物理链接介质(网线交换机等),一是互联网通信协议

协议简单的说就是规定数据的组织格式,格式是:头部(head)+数据部分(date)

OSI互联网七层协议:应表会传网数物

分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

有人将应用层、表示层、会话层归为一层,叫应用层,所以也叫五层协议

也有人将应用层、表示层、会话层归为一层,数据链路层和物理层归为网络接口层,所以也叫四层协议

在开发的角度,一般研究五层就可以了

五层协议:从上到下分别是应用层、传输层、网络层、数据链路层、物理层,当A电脑想发送数据到B电脑时,原始数据会被这五个层依次进行加密(就是说,其实每一层都有一个“协议”),加密后的数据进行传输,B电脑收到数据之后,会倒着将加密的数据进行“解封”,得到原始的数据

五层协议中应用层最接近用户,物理层最接近硬件,下面从物理层开始向上介绍

  • 物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0。一组物理层数据称之为数据位(bit),中间的物理链接可以是光缆、电缆、双绞线、无线电波

  • 数据链路层:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思,数据链路层定义了电信号的分组方式,早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet

    • ethernet规定:1. 一组电信号组成一个数据包,叫做帧(frame) 2. 数据帧分成两部分,头head和数据date,head长度固定18个字节,分成三个部分,分别是发送者/源地址,6个字节,接收者/目标地址,6个字节,数据类型6个字节;date最短46字节,最长1500字节,里面是数据包的具体内容,head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送 3. 前面的源地址和目标地址都是mac地址

    • 想要接入互联网的主机都需要一个网卡,网卡在制造的时候就被分配好了一个mac地址,该地址是独一无二的,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号),Mac地址唯一且不变,标识的是局域网中的一台电脑

    • 有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另外一台主机的mac地址),ethernet采用最原始的方式,也就是广播的方式进行通信,即计算机通信基本靠吼(对所有人发送请求,目标地址的主机才会回应)

    • 数据链路层虽然可以进行通信,但是有问题,一是当范围比较大的时候,会将数据包复制很大的量进行传输,这样会造成拥堵(A电脑想将数据包传输给一亿台电脑的时候,会将数据包复制一亿分给所有的电脑,对线路的负担很大),当进行小范围的广播的时候也会出现问题,就是不同的局域网之间无法进行通信,这就需要网络层了

    • Mac地址实现的局域网中的电脑通信,实现不同局域网之间的电脑通信需要网络层

    image

  • 网络层:IP协议,网络层引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

    • IP协议规定:1. 一个数据称为一个包(packet) 2. 数据也分为两部分:头和数据,头包括源地址和目标地址,该地址是IP地址,数据包含的是传输层发过来的整体的内容

    • IP协议定义的地址叫IP地址,目前广泛采用的是IPV4地址,规定地址是由32位2进制数字表示的,范围是0.0.0.0—255.255.255.255,但是目前IPV4的数量不够了,一些企业已经开始使用IPV6的地址,IP地址分成两部分:网络部分和主机部分,网络部分标识子网,主机部分标识主机

    • 子网掩码:就是表示子网络特征的一个参数,与IP地址共同使用,划分广播域。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么11111111.11111111.11111111.00000000就是子网掩码,写成十进制就是255.255.255.0。

      知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

      比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,

      172.16.10.1:10101100.00010000.00001010.000000001

      255255.255.255.0:11111111.11111111.11111111.00000000

      AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

      172.16.10.2:10101100.00010000.00001010.000000010

      255255.255.255.0:11111111.11111111.11111111.00000000

      AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

      结果都是172.16.10.0,因此它们在同一个子网络。

      IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络

    • ip数据包也分为head(长度为20到60字节)和data(最长为65515字节)部分,无需为ip包定义单独的栏位,直接放入以太网包的data部分,而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

    • 进行通信时,知道的是对方的ip地址,但是MAC地址是不知道的,所以要有一种方案使通过对方的IP地址得到Mac地址,这就需要ARP协议

    • ARP协议(Address Resolution Protocol地址解析协议):计算机通信是通过广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送,在谈及以太网协议时候,我门了解到,通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议,也就是说,arp协议是当计算机以广播的方式发送数据包时,获取目标主机的mac地址

    • ARP协议工作方式:每台主机ip都是已知的

      例如:主机172.16.10.10/24访问172.16.10.11/24

      一:首先通过ip地址和子网掩码区分出自己所处的子网

      场景 数据包地址
      同一子网 目标主机mac,目标主机ip
      不同子网 网关mac,目标主机ip

      二:分析172.16.10.10/24与172.16.10.11/24处于同一网络(如果不是同一网络,那么下表中目标ip为172.16.10.1,通过arp获取的是网关的mac)

      源mac 目标mac 源ip 目标ip 数据部分
      发送端主机 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据

      三:这个包会以广播的方式在发送端所处的自网内传输,所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己的mac,这样就得到了目标IP的Mac地址

    • IP地址实现的是不同局域网的电脑之间的通信,凭借IP地址+Mac地址能够找到世界上任何一台电脑(实际上只需要IP地址就可以,因为ARP协议实现了从IP地址找到Mac地址)

  • 传输层:建立端口到端口的通信,主要是遵循tcp/udp协议,数据包的名称叫做段(segment)

    • 网络层的ip能够区分子网,以太网层的mac能够区分主机,电脑主机上同时开启多个应用程序时,端口可以标识这台主机上的应用程序,所谓端口,就是应用程序与网卡关联的编号;端口范围0-65535,0-1023为系统占用端口,应用程序不会使用系统占用端口,现在凭借IP+MAC+端口,就能够表示任意的两个应用程序

    • 应用层可以自定义协议,但是需要注意两个问题,一是自定义协议必须包括两个部分:头部(包含数据的描述信息)和数据本身,二是头部的长度必须固定,这是为了在对数据包解封时能够区分头部信息

    • tcp协议:可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

    • tcp协议的数据包涵以下几个成分:以太网头、IP头、tcp头,数据

    • tcp报文:

    • img

    • tcp三次握手和四次挥手:

    • image

    • seq是序列号的意思,x,y都是未知数,代表未知的序列号,ack会在序列号的基础上加上1返回给client端,client端根据返回的结果判断是否是自己发出去的syn请求,左右的syn-sent,established表示的是状态,未发送请求的时候是syn-sent状态,收到回应之后是established状态,established是指单方向的可以发送数据的状态(就是c端可以向s端传输数据了),服务端一直处于time-wait状态的时候,意味着服务端正在经历高并发的状态,挥手的时候通常是服务端发起,上面的图片显示的是客户端开始,但是原理是一样的

    • 在建立tcp协议之前,必须创建一个双向的链接,也就是三次握手建立链接,在断开连接的时候,由于链接中存在数据传输,所以必须经过四次挥手才能断开连接

    • tcp协议可靠的原因:这是因为发送数据必须等到对方确认后,才会将自己内存中的数据删除,否则会重传

    • tcp协议的半链接池(backlog):实际上是一个队列,先进先出,使队列的容量一定,这样当链接请求过多的时候,可以将队列容纳不下的链接放在外面稍后处理,队列里面的链接处理一个,就往队列中增加一个

    • udp协议:不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包

    • udp协议的数据包涵以下几个成分:以太网头、IP头、tcp头,数据

    • tcp协议安全可靠,但是传输效率低,udp协议不安全,但是传输效率高,需要实时性传输的时候一般选用udp协议传输

  • 应用层:用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,所以必须规定好数据的组织形式,应用层的功能就是规定应用程序的数据格式。例如:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。

image

  • 套接字(socket):socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信,在python中,套接字的实现有一个模块叫socket

5.网络通信的实现

想实现网络通信,每台主机需具备四要素:本机的IP地址、子网掩码、网关的IP地址、DNS的IP地址

获取这四要素分两种方式:

  1. 静态获取:即手动配置

  2. 动态获取:通过dhcp获取

(1)最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。

(2)后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。

(3)最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

6. DNS域名解析(Domain Name Server)

DNS的作用:在互联网中,其实没有类似于www.xxx.com这种域名方式,而替代的是以IP地址,如222.222.222.222,那我们在IE地址栏中应当输入222.222.222.222才能打开网站www.xxx.com,但是这样网站就变得很难记忆,没有标标识性。这个时候DNS就出现了,它的作用就是将222.222.222.222解析为www.xxx.com,那么我们登陆的时候就直接输入域名就可以了

为什么一定要设置DNS才能上网?有些朋友可能会发现,为什么我可能登陆QQ、MSN,但却打不开网页呢?其实大部分原因都是因为DNS服务器故障造成的,DNS服务器地址是唯一的,是运营商提供给终端用户用来解析IP地址及域名的关系,而如果不设定DNS服务器地址,那么就无法查询地址的去向,自然也就打不开网页,而QQ、MSN等即时聊天软件,采用的是UDP传输协议,即不可靠传输协议,无需提供DNS服务器地址,也同样可以登陆。

DNS的两种查询方式

  1. 递归:主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
  2. 迭代:本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

DNS查询过程

  1. 首先客户端位置是一台电脑或手机,在打开浏览器以后,比如输入http://www.zdns.cn的域名,它首先是由浏览器发起一个DNS解析请求,如果本地缓存服务器中找不到结果,则首先会向根服务器查询,根服务器里面记录的都是各个顶级域所在的服务器的位置,当向根请求http://www.zdns.cn的时候,根服务器就会返回.cn服务器的位置信息。

  2. 递归服务器拿到.cn的权威服务器地址以后,就会寻问cn的权威服务器,知不知道http://www.zdns.cn的位置。这个时候cn权威服务器查找并返回http://zdns.cn服务器的地址。

  3. 继续向http://zdns.cn的权威服务器去查询这个地址,由http://zdns.cn的服务器给出了地址:202.173.11.10

  4. 最终才能进行http的链接,顺利访问网站。

  5. 这里补充说明,一旦递归服务器拿到解析记录以后,就会在本地进行缓存,如果下次客户端再请求本地的递归域名服务器相同域名的时候,就不会再这样一层一层查了,因为本地服务器里面已经有缓存了,这个时候就直接把http://www.zdns.cn的A记录返回给客户端就可以了。

DNS查询类型
DNS的查询类型有20种,比较常用的查询类型有有A,NS,CNAME,PTR,MX等五种类型。以下分别介绍五种类型:
1)A:由DNS域名到IP地址的查询,即正向查询,编程中由函数gethostbyname实现。
2)PTR:由IP到域名的查询,即逆向查询,编程中由函数gethostbyaddr。
3)NS:查询解析的名字服务器(Name server)。
4)CNAME:查询DNS的别名。
5)MX:邮箱服务器查询。

DNS资源记录
记录一条域名信息映射关系,称之为资源记录(RR)。
当我们查询域名http://www.zdns.cn的时候,查询结果得到的资源记录结构体中有如下数据:
1、TTL,就是生存周期,是递归服务器会在缓存中保存该资源记录的时长。
2、网络/协议类型,它的代表的标识是IN,IN就是internet,目前DNS系统主要支持的协议是IN。
3、type,就是资源记录类型,一般的网站都是都是A记录(IPv4的主机地址)。
4、rdata是资源记录数据,就是域名关联的信息数据。

DNS缓存

DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果临时储存起来。并且它会为缓存设定一个失效时间 (例如N小时),在这N小时之内,当你再次访问这个网站时,系统就会直接从你电脑本地的DNS缓存中把结果交还给你,而不必再去询问DNS服务器,变相“加速”了网址的解析。

当然,在超过N小时之后,系统会自动再次去询问DNS服务器获得新的结果。所以,当你修改了 DNS 服务器,并且不希望电脑继续使用之前的DNS缓存时,就需要手动去清除本地的缓存了。

DNS缓存分类

1)浏览器DNS缓存(内存中): 浏览器会按照一定频率缓存DNS记录
2)本地操作系统DNS缓存(内存中): 如果浏览器缓存中找不到需要的DNS记录,那就去操作系统找。
3)本地HOSTS文件(硬盘中): Windows系统中位于C:\Windows\System32\drivers\etc
4)路由器指定的DNS(远程): 路由器自动获取DNS地址,也可以手动修改-登录后台设置DNS服务器地址
 ps:路由器DNS被篡改会造成域名劫持,你访问的网址都会被定位到同一个位置,但是IP直接可以访问
5)ISP的DNS服务器(远程):  ISP(Internet Service Provider互联网服务提供商、联通电信移动),ISP有专门的DNS服务器应 对DNS查询请求 6)根服务器(远程,跨国): ISP的DNS服务器还找不到的话,它就会向根服务器发出查询请求

调用系统缓存需要跨进程,消耗大,因此为了解析速度的方便,就有了一系列缓存来加快IP查找速度。

浏览器DNS查找顺序

浏览器DNS缓存->本地系统DNS缓存->本地计算机HOSTS文件->ISP DNS缓存->递归or迭代搜索

期间如果查询到了,也就直接访问ip地址了,这个就像三级缓存原理一样,例如,能够在hosts文件中找到就不会再去查其他的

清除DNS缓存

打开cmd执行命令:ipconfig /all

全国通用DNS地址(国内用户推荐使用,速度较快!)
首先DNS服务器地址添:114.114.114.114  (位于北京人民英雄纪念碑)
备用DNS服务器地址添:114.114.115.115
全球通用DNS地址(此DNS地址为谷歌服务器的)
首选DNS服务器地址添:8.8.8.8
备用DNS服务器地址添:8.8.4.4

查看本地dns缓存命令:ipconfig /displaydns

清除本地dns缓存命令:ipconfig /flushdns

清除浏览器缓存:

我们在开发的时候,有时候会给某个域名绑hosts,用于本地开发测试,但是绑了之后,用谷歌浏览器访问会发现并没有生效,按F12会发现访问的还是线上的ip,说明浏览器是有该域名的dns缓存的,那么如何清除浏览器的dns缓存呢?
1、针对谷歌浏览器
谷歌浏览器清除方法如下:打开浏览器,访问如下地址
chrome://net-internals/#dns
点击 clear host cache,就清楚了浏览器的dns缓存,再访问绑hosts的域名,就会发现ip变啦
2、针对火狐浏览器
如果是firefox火狐浏览器的话,可以按照以下方式:
在地址栏中 about:config 并回车,可能会出现一个警告信息,直接点击按钮进入,会出现firefox的所有配置信息,通过搜索dns 进行过滤,可以看到一项名为 network.dnsCacheExpirationGracePeriod 项,它对应的值就是DNS缓存的时间,双击此项,会出现修改的提示框,填入 0 (不缓存DNS)即可。

其他了解

13台根dns:

A. root-servers.net198.41.0.4美国
B. root-servers.net192.228.79.201美国(另支持IPv6
C. root-servers.net192.33.4.12法国
D. root-servers.net128.8.10.90美国
E. root-servers.net192.203.230.10美国
F. root-servers.net192.5.5.241美国(另支持IPv6
G. root-servers.net192.112.36.4美国
H. root-servers.net128.63.2.53美国(另支持IPv6
I. root-servers.net192.36.148.17瑞典
J. root-servers.net192.58.128.30美国
K. root-servers.net193.0.14.129英国(另支持IPv6)
L. root-servers.net198.32.64.12美国
M. root-servers.net202.12.27.33日本(另支持IPv6)

域名定义:http://jingyan.baidu.com/article/1974b289a649daf4b1f774cb.html

顶级域名:以.com,.net,.org,.cn等等属于国际顶级域名,根据目前的国际互联网域名体系,国际顶级域名分为两类:类别顶级域名(gTLD)和地理顶级域名(ccTLD)两种。类别顶级域名是以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等结尾的域名,均由国外公司负责管理。地理顶级域名是以国家或地区代码为结尾的域名,如"CN"代表中国,"UK"代表英国。地理顶级域名一般由各个国家或地区负责管理。

二级域名:二级域名是以顶级域名为基础的地理域名,比喻中国的二级域有:.com.cn,.net.cn,.org.cn,.gd.cn等.子域名是其父域名的子域名,比如父域名是abc.com,子域名就是www.abc.com或者.abc.com.
一般来说,二级域名是域名的一条记录,比如alibaba.com是一个域名,www.alibaba.com是其中比较常用的记录,一般默认是用这个,但是类似
.alibaba.com的域名全部称作是alibaba.com的二级

7.网络通信流程

1.本机获取

  • 本机的IP地址:192.168.1.100
  • 子网掩码:255.255.255.0
  • 网关的IP地址:192.168.1.1
  • DNS的IP地址:8.8.8.8

2.打开浏览器,想要访问Google,在地址栏输入了网址:www.google.com。

3.dns协议(基于udp协议)

4.HTTP部分的内容,类似于下面这样:

GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。

5.TCP协议

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

6.IP协议

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

7.以太网协议

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

8.服务器端响应

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的”HTTP请求”,接着做出”HTTP响应”,再用TCP协议发回来。

本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。

posted @ 2021-11-05 23:09  奇点^  阅读(2296)  评论(0)    收藏  举报