端口、IP、HTTP、URL、127.0.0.1...这些名词几乎天天都能听到,但是真的让我说出点什么好像还真的不太知道。对于这些天天与我们打交道的词汇,花时间了解一下,还是十分有必要的。
1.名词解释
HTTP-(HyperText Transfer Protocol)-超文本传输协议IP-(Interner Protocol)-网际协议DNS-(Domain Name System)-网域名称系统URL-(Uniform Resource Locator)-统一资源定位符HTML-(HyperText Markup language)-超文本标记语言
2.TCP/IP,UDP,HTTP,HTTPS等都是指的什么
2.1 TCP/IP是一个协议族
首先互联网协议套件(网络模型)+网络传输协议家族构成了网际网络的基础架构。由于TCP(传输控制协议),IP(网际协议)为该家庭中的最早标准,所以这个协议族又被称为TCP/IP协议族。TCP/IP通过点对点的机制,将数据应该如何进行封装、定制、传输、路由以及在目的地如何接受,都加以标准化。
TCP/IP协议族将软件通信的过程抽象化为四个抽象层,协议族下的各种协议,依据其功能不同,被分配到这四个层次结构中。(被认为是对OSI模型的简化,OSI-开放式系统互连模型(Open System Interconnection Model)一个试图使各种计算机在世界范围内互联为网络的标准框架)。
在1983年TCP/IP协议取代旧的NCP(网络控制协议),成为现代互联网的基石。与此同时,随着互联网的发展,IPv4协议已经接近他的功能上限,原因在于一个是IPv4只有32位,IP地址只有21亿多个。另一个是无法管理宽带和优先级,故而不能很好的支持现今越来越多实时的语音和视频应用,因此Ipv6应运而生。
OSI模型分层示意图:(源自维基百科)
TCP/IP协议族分层示意图:
知道了TCP/IP协议族,那么UDP/HTTP/HTTPS之间的关系就没有那么抽象了。
2.2 什么是TCP与UDP协议?
TCP(Transmission Control Protocol,传输控制协议),是面向连接的协议,也就是说,在收发数据之前,必须和对方建立可靠的连接。
UDP(User Data Protocol,用户数据报协议),UDP是一个非连接的协议,传输数据之前,源端和终端之间不建立连接,当想传送时就简单地去抓取来自应用程序的数据,并尽可能快的扔到网络上。并且由于传输数据不建立连接,因此也就不需要状态维持,所以一台服务器可以同时向多个客户机传输相同的信息。
- 他们二者的区别?
TCP是基于流的协议,传输数据前必须确认源端和终端时连接的,并且出错会重新发送,所以稳定可靠,适用于质量要求很高的场景。但是缺点就是慢。并且TCP协议是全双工协议,也就是说数据的发送端和接收端可以同时发送和接收数据。
而UDP是面向报文的,程序结构比较简单,虽然比TCP快,但是不能保证不丢包,所以质量低。
2.3 ping命令的原理
ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。大多数的 TCP/IP 实现都在内核中直接支持Ping服务器。
2.4 HTTP与HTTPS
- HTTP协议-(Hyper Text Transfer Protocol 超文本传输协议)。
他是一种发布和接受HTML页面的方法,通过HTTP或者HTTPS请求的资源由URI(统一资源标识符)来标识。由于请求信息在HTTP协议中都是采用明文传输的,所以不适合用以发送携带敏感信息的请求。
- HTTPS协议-(HyperText Transfer Protocol over Secure Socket Layer)
一般理解为HTTP+SSL/TLS,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
- 二者优缺点:
HTTP协议简单快速,客户向服务器请求服务时,只需传送请求方法与路径。并且HTTP协议很灵活,允许传输任意类型的数据对象。另外两个特点:无连接与无状态。缺点就是采用明文传输,所以不安全。
HTTPS采用SSl加密通信,保证了传输过程的安全性。但是多次握手导致页面的加载时间延长近50%。并且HTTPS连接缓存不如HTTP高效,申请SSL证书也需要钱,以及SSL涉及的安全算法都需要消耗CPU,对服务器消耗较大。
2.5 URL与URI是什么?
- URI:Uniform Resource Identifier 统一资源标识符。
我们可以通过 URI 知道一个资源是什么。 - URL:Uniform Resource Location 统一资源定位符。
标示了一个具体的资源位置,互联网上的每个文件都有一个唯一的URL。
2.6 TCP三次握手与四次挥手
三次握手:
第一次握手:主机A通过向服务器B发送一段含有同步标志(SYN)的数据段给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B,我想要和你通信,你可以使用哪个序列号作为起始数据段来回应我。
第二次握手:服务器B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事情:1.我已经收到你的请求,你可以传输数据了。2.你要用那个数据段来回应我。
第三次握手:主机A收到这个数据段之后,再发送一个确认应答,确认已经收到服务器B的数据段。告诉服务器,我已经收到回复,现在可以传输实际数据了。
四次挥手:
第一次,当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
第二次,主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
第三次,由B端再提出反方向的关闭请求,将FIN置1。
第四次,主机A对主机B的请求进行确认,将ACK置1,双方关闭结束。
2.7 TCP报文的详细结构
TCP报文示意图:
- 源端口号-指明发送数据的进程。
- 目的端口号-指明主机接受数据的进程。
- 序号-长度4个字节,用来对从TCP发送端向接入端发送的字节流进行编号。
- 确认号-长度4个字节,包含确认发送的一端所期望收到的下一序号。确认号只有在ACK标志位为1的时候才有效。
- 保留位-长度6个字节,为将来定义新用途所保留的。
- 标志-
URG-紧急标志位-说明紧急指针有效。
ACK-确认标志位-说明确认序号有效。
PSH-推标志位,置位时表示接收方应立即请求将报文交给应用层。
RST-复位标志,用以重建一个已经混乱的连接。
SYN-同步标志,该标志仅在三次握手建立TCP连接时有效。
FIN-结束标志,该标志位的数据包用以结束一个TCP会话。 - 窗口-长度为2个字节,TCP流量的控制由连接的每一端通过声明的窗口大小来提供。
- 检验和-长度为2个字节,该字段覆盖整个TCP报文段,是个强制性的字段,是发送端计算和存储,到接收端后,由接收端进行验证。
- 紧急指针-长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。
3.IP与端口
3.1 IP协议与约定了两件事情
- 如何定位一台设备
- 如何封装数据报文,以跟其他设备交流
可使用 www.ip138.com 查看自己的ip地址。
3.2 IP分为内网和外网
这个只能去找运营商买,然后路由器连上电信的服务器,那么路由器就会有一个[外网IP]。但是注意,这个IP不是固定的,如果你重启路由器,就可能会得到一个新的IP,想要固定的IP地址,还是得花钱。
如何获取内网IP?
这个就很简单了,路由器连上服务器之后,会在家里创建一个内网,内网中的设备使用内网IP,IP格式一般都是192.168.xxx.xxx 比如192.168.1.1。然后路由器会给每一个内网中的设备分配一个不同的内网IP。例如:
这个 192.168.43.230就是我们在内网中的地址,192.168.43.170就是路由器的地址。
几个特殊的IP
- 127.0.0.1 -表示自己
- localhost -通过host制定为自己
- 0.0.0.0 -不表示任何设备
使用Nodepad++打开文件C:\Windows\System32\drivers\etc
修改其中的内容就好:
路由器的功能
- 现在的路由器有两个IP,一个内网IP,以为外网IP。
- 内网中的设备可以相互访问,但是不能直接访问外网。
- 内网设备想要访问外网,就必须通过路由器。
- 外网中的设备可以相互访问,但是不能访问你的外网。
- 外网设备想要把内容推送到内网,也必须通过路由器。
- 内外网联系的唯一联通点就是路由器,所以路由器又称为网关。
- 如果家里有两个路由器,那么路由器之间也是隔绝的关系。
3.3 端口
一台机器可以提供不同的端口服务
- 要提供HTTP服务最好使用80端口。
- 要提供HTTPS服务最好使用443端口。
- 要使用FIP服务最好使用21端口。
- 一共有65535个端口。
- 0到1023号端口是留给系统用的,你只有拥有了管理员权限后,才能使用这1024个端口。
- 其他端口可以给普通用户使用。
- http-server默认使用8080端口。
- 如果端口被占用,那么只能换一个端口。
使用hs -c-1 -p 1234命令在本地启动一个端口,可以使用该端口进入页面。
如图所示:
这个123.html是我桌面上新建的html文件。这时候我重新开一个git bash,再使用前面的命令,就能看到端口被占用的报错:
4.域名、路径、查询参数、锚点
4.1 域名
域名就是对IP的别称,查看百度对应的IP:
$ ping baidu.com
正在 Ping baidu.com [220.181.38.148] 具有 32 字节的数据:
这个IP很可能不一样,原因在于:
- 一个域名可以对应不同的IP,这个叫负载均衡,防止一台机器扛不住。
- 一个IP可以对应不同的域名,这个叫共享主机。
- 域名和IP是如何对应起来的呢?
首先当我们在浏览器中输入baidu.com并且按下回车的时候,浏览器会向(电信/联通)提供的DNS服务器询问baidu.com对应什么IP,(电信/联通)会回答一个IP,然后浏览器才会向对应的(80/443)端口发送请求,请求的内容是是查看baidu.com的首页。如图所示:
也可以手动设置DNS地址,(win10)步骤:打开网络和Internet选项->以太网->更改适配器选项->选中自己常用的网络鼠标右键属性->Internet协议版本4(TCP/Ipv4)
-
那么为什么是80/443端口呢?
服务器默认用80端口提供http服务,用443提供https服务。 -
www.xxxxx.com与xxxxx.com是同一个域名嘛?
他们之间的关系是这样的:
- com是顶级域名。(com是company的缩写)
- xxxxx.com是二级域名。(俗称一级域名)
- www.xxxxx.com是三级域名。(俗称二级域名)
- 他们之间是父子关系,所以xxxxx.com与www.xxxxx.com很有可能不是一家公司。
4.2 路径、查询参数、锚点
弄清楚这样几个问题:
- 同一台服务器上如何请求不同的页面?
使用不同的路径:https://developer.mozilla.org/zh-CN/docs/Web/CSS与https://developer.mozilla.org/zh-CN/docs/Web/HTML
注意:HTTP协议的所有路径都是以/开头的。
- 同一个页面如何显示不同的内容?
查询参数可以做到:https://www.baidu.com/s?wd=mao与https://www.baidu.com/s?wd=gou - 同一个内容如何定位到不同的位置?
锚点可以做到:
https://developer.mozilla.org/zh-CN/docs/Web/CSS#参考书与https://developer.mozilla.org/zh-CN/docs/Web/CSS#教程
注意:
- 锚点看起来有中文但实际不支持中文,过程中会被编码成其他字符。
- 由于锚点是不会传给服务器的,所以锚点是无法在Network面板看到的。
- 最终我们可以得出结论:
URL=协议+域名或者IP+端口号+路径+查询字符串+锚点
端口号默认80/443被省略了。
4.3 curl命令
- 使用
curl命令发送http请求
例如:
curl https://www.baidu.com/命令发起http请求:
curl -v https://www.baidu.com/命令显示细节:
从响应的内容中可以看出,这个过程是先根据url,请求DNS得到对应的IP,然后进行TCP连接,连接成功再发起HTTP请求。相应结束后关闭TCP连接,实现真正的结束。
- 使用
curl命令发起POST请求 在参数中增加-X POST,例如:
curl -v -X POST -d 'username=zhangsan' https://localhost:8888/
- 发起
curl请求,指定请求头 在参数中增加-H 'Name:value'例如:
curl -v -X POST -H 'Accept:text/html' https://localhost:8888/