URL 是什么?

本文写于 2020 年 5 月 16 日

URL 是什么?天天听到人家说到这个名词,那它到底是什么?

URL 是统一资源定位符,Uniform Resource Locator。

俗称——网址。

看看维基百科对它的解释:

它是因特网上标准的资源的地址,好像门牌一样。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址,现在它已经被万维网联盟编制为因特网标准 RFC 1738。

在互联网的历史上,统一资源定位符的发明是一个非常基础的步骤。统一资源定位符的语法是一般的,可扩展的,它使用美国信息交换标准代码的一部分来表示因特网的地址。统一资源定位符的开始,一般会标志着一个计算机网络所使用的网络协议。

那到底,URL 的规则是什么呢?

它有哪些组成部分呢?

让我们一一道来。

01 IP 地址

IP,Internet Protocol,网际协议。它是用来分组交换网络数据的一种协议,也是 TCP/IP 协议族中的主要协议。

IP 地址,IP Address,网际协议地址。

顾名思义——只要我们在互联网中,我们至少会拥有一个独立的 IP,它代表我们的位置。

也就是说 IP 地址负责标识主机网络寻址

那这里就要提到内网和外网的概念了。

假设我们买了宽带,需要装网,这个时候我们就需要如下步骤:

  1. 买宽带服务;
  2. 买一个猫;
  3. 买一个路由器;
  4. 设备连上路由器;
  5. 路由器连上电信服务器,路由器就会拥有外网 IP
  6. 如果重启了路由器,就可能会被重新分配一个 IP,路由器没有固定的外网 IP
  7. 手机、电脑等多个终端的 IP,则是内网 IP,一般是 192.169.xxx.xxx

而在这之后,路由器,就身处外网与内网;你的各种终端设备,都处于内网。

  1. 那么路由器有两个 IP,一个外网,一个内网;
  2. 内网中的设备可以互相访问,但是不能直接访问外网,必须通过路由器;
  3. 外网的设备可以互相访问,但是不可以直接访问内网,必须通过路由器——所以路由器也被叫做 “网关”

几个特殊的 IP

  • 127.0.0.1 代表自己
  • localhost 通过 hosts 指定为自己
  • 0.0.0.0 不表示任何设备

我们知道了这些,就可以通过 127.0.0.1 来从浏览器访问自己。

我们可以使用 mac 自带的 apache,来启动服务器:sudo apachectl start。(关闭命令为xxxx stop

然后可以在浏览器窗口输入:127.0.0.1,访问到“It Works”。

这个地址输入localhost也是可以访问的。

接着切换到 private 文件夹下的 etc 文件夹,然后使用sudo vim hosts,用管理员权限编辑 hosts 文件。

我们发现里面写着:127.0.0.1 localhost这是什么意思?

可以尝试添加127.0.0.1 aloha,接着保存后,在浏览器输入:aloha,惊奇的发现我们依然访问了同样的网页!

hosts 文件可以让我们自定义127.0.0.1的别名。

02 TCP/UDP 端口(Port)

一台机器可以提供多种不同服务,这就是端口的作用。

  • 要提供 HTTP 服务最好使用 80 端口;
  • 我们自己使用时,最好使用 8080 端口;
  • 要提供 HTTPS 服务,最好使用 443 端口;
  • 要提供 FTP 服务,最好使用 21 端口;
  • 一共有 65535 个端口。

维基百科为我们列出了常用端口及其用途。

规则:

  • 0-1023 号端口是留给系统使用的,除非拥有服务器权限;
  • 如果端口被占用,只能换一个端口。

那么和 IP 结合起来看,就能明白:IP 是用来提供位置的,端口则是不同的服务入口

二者缺一不可!

03 域名

域名就是 IP 的别称。

打开命令行,输入ping baidu.com,就会返回给我们相应的 IP 与端口。

但是我们发现,不同的人 ping 同一个网站,返回的 IP 居然不一样

这个就叫做负载均衡

一般是将各地访问者,指向离他更新的服务器。一方面提高访问速递,一方面减轻服务器压力。

所以:一个 IP 可以对应不同域名;一个域名也可以对应多个 IP。

04 DNS

Domain Name System 是 DNS 的全称,域名系统。

维基的解释是:

它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

很难理解,但也很好理解,就是说 DNS 告诉我们域名和 IP 的匹配关系

比如我们刚刚 ping 域名的时候,为什么能返回 IP 呢?

假设我们在浏览器输入了百度的域名,想要访问百度,那么过程如下:

  1. 浏览器向网络提供商提供的 DNS 服务器询问:baidu.com 是对应什么 IP?
  2. 供应商回答一个 IP(很复杂);
  3. 浏览器向对应的 80/443 端口发送请求(之前说了,80 是 HTTP,443 是 HTTPS);
  4. 请求内容是查看 baidu.com 的首页。

05(插曲) www.baidu.com 和 baidu.com 是一个域名吗?

不是。

com(company)是顶级域名,baidu.com 是一个二级域名(俗称一级域名)——而 www.baidu.com 是三级域名(俗称二级)。

所以,www.baidu.com 是 baidu.com 的子域名。

所以,他们有可能不是同一个网站。

06 路径

不同的路径,访问不同的页面。

这是什么意思呢?

比如说假设www.baidu.com/搜索可以访问搜索页面;www.baidu.com/图片可以访问百度图片。

07 查询参数

同一个页面,不同的内容。

www.baidu.com/用户?id=12138www.baidu.com/用户?id=9527就是让“用户”界面,接收不同的参数。

如果有多个参数可以用 & 连接。

这个叫做查询参数

08 锚点

那如何在同一个页面上,查看不同的位置呢?

比如微信公众号,我们发现他会记住上次的阅读位置。

这可以通过锚点实现。

比如:www.baidu.com/搜索?text=Bilibili#one

但是锚点不支持中文,有些看起来是中文,但是复制粘贴之后会变成一长串字母符号和数字。实际上,和中文是一个意思,只是编码后的结果。

并且锚点,不在请求之内。服务器不会接收#后的字符串。

提一下 curl 命令

curl 可以用来发起 http 请求,比如:curl https://baidu.com,使用curl -v https://baidu.com,就可以看到如何完成的请求过程。

使用curl请求网页的时候,会发生以下事情:

  • url 会被 curl 重写,先请求 DNS 来获得 IP;
  • 然后进行 TCP 连接,成功后发送 HTTP 请求;
  • 响应结束后,关闭 TCP 连接,结束。

请求内容为:

> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.64.1
> Accept: */*

响应内容为:

< HTTP/1.1 200 OK
< Date: Sat, 16 May 2020 15:04:07 GMT
< Server: Apache
< Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
< ETag: "51-47cf7e6ee8400"
< Accept-Ranges: bytes
< Content-Length: 81
< Cache-Control: max-age=86400
< Expires: Sun, 17 May 2020 15:04:07 GMT
< Connection: Keep-Alive
< Content-Type: text/html

那 HTTP 到底是做什么的呢?

HTTP 是协议,协议就是规定某些事情如何去做的标准。

目前看来,HTTP 可以规定上面的“请求内容”、“响应内容”。

总结

最后,总结一下,URL 到底由哪些东西组成?

一个完整的 URL(uniform resource locator 统一资源定位符),如下所示:

https://www.baidu.com/s?wd=hello&rsv_spt=1#5

分解如下:

  • https:// 协议
  • www.baidu.com 域名
  • /s 路径
  • ?wd=hello&rsv_spt=1 查询参数
  • #5 锚点
  • 端口,默认 443 或者 80,但是不会显示

(完)

URL 是什么?的更多相关文章

  1. HTML URL地址解析

    通过JavaScript的location对象,可获取URL中的协议.主机名.端口.锚点.查询参数等信息. 示例 URL:http://www.akmsg.com/WebDemo/URLParsing ...

  2. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  3. Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  4. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

  5. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  6. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

    今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:

  7. MVC通过路由实现URL重写

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Ro ...

  8. 【转】java通用URL接口地址调用方式GET和POST方式

    java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...

  9. linux字符串url编码与解码

    编码的两种方式 echo '手机' | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g' echo '手机' |tr -d '\n' |od -An -tx ...

  10. 如何获取url中的参数并传递给iframe中的报表

    在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数 ...

随机推荐

  1. Zookeeper 保证了如下分布式一致性特性?

    1.顺序一致性 2.原子性 3.单一视图 4.可靠性 5.实时性(最终一致性) 客户端的读请求可以被集群中的任意一台机器处理,如果读请求在节点上注册了 监听器,这个监听器也是由所连接的 zookeep ...

  2. DateFormat类,利用SimpleDateFormat解决系统时间初始(格式化/解析)问题

    目标: java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换. 格式化 ...

  3. 无需Flash实现图片裁剪——HTML5中级进阶

    前言 图片裁剪上传,不仅是一个很贴合用户体验的功能,还能够统一特定图片尺寸,优化网站排版,一箭双雕. 需求就是那么简单,在浏览器里裁剪图片并上传到服务器. 我第一个想到的方法就是,将图片和裁剪参数(x ...

  4. jq easyui数据网络的分页过程

    第一次写技术方面的文章,有点忐忑,总怕自己讲的不对误导别人.但是万事总有个开头,有不足错误之处,请各位读者老爷指出. 言归正传,最近刚进新公司,上头要求我先熟悉熟悉easyui这个组件库.在涉及到da ...

  5. WebGL小姐姐教我学画画之起手式

    初次接触WebGL,如有错误之处欢迎留言,共同学习进步. v WebGL的自画像 我,WebGL,全名Web Graphics Library,是为了让死宅程序猿们(摊手)能在浏览器上为所欲为的画女朋 ...

  6. 从ES6重新认识JavaScript设计模式(三): 建造者模式

    1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...

  7. SQList基础+ListView基本使用

    今日所学: SQList基础语法 SDList下载地址 SQLite Download Page SQList安装教程SQLite的安装与基本操作 - 极客开发者-博客 ListView用法 没遇到什 ...

  8. Wireshark查找与标记数据包

    查找数据包 按Ctrl-F. 查找数据包提供了4个选项: 显示过滤器(Display filter):该选项可以让你通过输入表达式进行筛选,并只找出那些满足该表达式的数据包.如:not ip, ip. ...

  9. [ThinkPHP]2-Rce buuoj

    [ThinkPHP]2-Rce 进来是这个页面 构造路径. 好,构造正确,但是服务器拦截了对该操作的访问 打开提示网站,看到关键信息 分析正则 老版本的正则可以用 '@'符号表示模式.以下正则是模式e ...

  10. Linux下编写和加载 .ko 文件(编写linux驱动)

    一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...