Java基础复习之旅(1)-计算机网络篇

331 阅读10分钟

摘要

\quad 端口、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是一个协议族

\quad 首先互联网协议套件(网络模型)+网络传输协议家族构成了网际网络的基础架构。由于TCP(传输控制协议),IP(网际协议)为该家庭中的最早标准,所以这个协议族又被称为TCP/IP协议族。TCP/IP通过点对点的机制,将数据应该如何进行封装、定制、传输、路由以及在目的地如何接受,都加以标准化。
\quad TCP/IP协议族将软件通信的过程抽象化为四个抽象层,协议族下的各种协议,依据其功能不同,被分配到这四个层次结构中。(被认为是对OSI模型的简化,OSI-开放式系统互连模型(Open System Interconnection Model)一个试图使各种计算机在世界范围内互联为网络的标准框架)。
\quad 在1983年TCP/IP协议取代旧的NCP(网络控制协议),成为现代互联网的基石。与此同时,随着互联网的发展,IPv4协议已经接近他的功能上限,原因在于一个是IPv4只有32位,IP地址只有21亿多个。另一个是无法管理宽带和优先级,故而不能很好的支持现今越来越多实时的语音和视频应用,因此Ipv6应运而生。
OSI模型分层示意图:(源自维基百科)

TCP/IP协议族分层示意图:

知道了TCP/IP协议族,那么UDP/HTTP/HTTPS之间的关系就没有那么抽象了。

2.2 什么是TCP与UDP协议?

\quad TCP(Transmission Control Protocol,传输控制协议),是面向连接的协议,也就是说,在收发数据之前,必须和对方建立可靠的连接。
\quad UDP(User Data Protocol,用户数据报协议),UDP是一个非连接的协议,传输数据之前,源端和终端之间不建立连接,当想传送时就简单地去抓取来自应用程序的数据,并尽可能快的扔到网络上。并且由于传输数据不建立连接,因此也就不需要状态维持,所以一台服务器可以同时向多个客户机传输相同的信息。

  • 他们二者的区别?

\quadTCP是基于流的协议,传输数据前必须确认源端和终端时连接的,并且出错会重新发送,所以稳定可靠,适用于质量要求很高的场景。但是缺点就是慢。并且TCP协议是全双工协议,也就是说数据的发送端和接收端可以同时发送和接收数据。

\quad而UDP是面向报文的,程序结构比较简单,虽然比TCP快,但是不能保证不丢包,所以质量低。

2.3 ping命令的原理

\quadping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。大多数的 TCP/IP 实现都在内核中直接支持Ping服务器。

2.4 HTTP与HTTPS

  • HTTP协议-(Hyper Text Transfer Protocol 超文本传输协议)。

\quad他是一种发布和接受HTML页面的方法,通过HTTP或者HTTPS请求的资源由URI(统一资源标识符)来标识。由于请求信息在HTTP协议中都是采用明文传输的,所以不适合用以发送携带敏感信息的请求。

  • HTTPS协议-(HyperText Transfer Protocol over Secure Socket Layer)

\quad一般理解为HTTP+SSL/TLS,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

  • 二者优缺点:

\quad HTTP协议简单快速,客户向服务器请求服务时,只需传送请求方法与路径。并且HTTP协议很灵活,允许传输任意类型的数据对象。另外两个特点:无连接与无状态。缺点就是采用明文传输,所以不安全。
\quad 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三次握手与四次挥手

三次握手: \quad 第一次握手:主机A通过向服务器B发送一段含有同步标志(SYN)的数据段给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B,我想要和你通信,你可以使用哪个序列号作为起始数据段来回应我。
\quad 第二次握手:服务器B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事情:1.我已经收到你的请求,你可以传输数据了。2.你要用那个数据段来回应我。
\quad 第三次握手:主机A收到这个数据段之后,再发送一个确认应答,确认已经收到服务器B的数据段。告诉服务器,我已经收到回复,现在可以传输实际数据了。

四次挥手:

\quad 第一次,当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
\quad 第二次,主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
\quad 第三次,由B端再提出反方向的关闭请求,将FIN置1。
\quad 第四次,主机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协议与约定了两件事情

  1. 如何定位一台设备
  2. 如何封装数据报文,以跟其他设备交流

\quad 可使用 www.ip138.com 查看自己的ip地址。

3.2 IP分为内网和外网

如何获取外网IP?

\quad 这个只能去找运营商买,然后路由器连上电信的服务器,那么路由器就会有一个[外网IP]。但是注意,这个IP不是固定的,如果你重启路由器,就可能会得到一个新的IP,想要固定的IP地址,还是得花钱。

如何获取内网IP?
\quad 这个就很简单了,路由器连上服务器之后,会在家里创建一个内网,内网中的设备使用内网IP,IP格式一般都是192.168.xxx.xxx 比如192.168.1.1。然后路由器会给每一个内网中的设备分配一个不同的内网IP。例如:
\quad 这个 192.168.43.230就是我们在内网中的地址,192.168.43.170就是路由器的地址。

几个特殊的IP

  1. 127.0.0.1 -表示自己
  2. localhost -通过host制定为自己
  3. 0.0.0.0 -不表示任何设备
为IP指定别名步骤

使用Nodepad++打开文件C:\Windows\System32\drivers\etc
修改其中的内容就好: 路由器的功能

  1. 现在的路由器有两个IP,一个内网IP,以为外网IP。
  2. 内网中的设备可以相互访问,但是不能直接访问外网。
  3. 内网设备想要访问外网,就必须通过路由器。
  4. 外网中的设备可以相互访问,但是不能访问你的外网。
  5. 外网设备想要把内容推送到内网,也必须通过路由器。
  6. 内外网联系的唯一联通点就是路由器,所以路由器又称为网关。
  7. 如果家里有两个路由器,那么路由器之间也是隔绝的关系。

3.3 端口

一台机器可以提供不同的端口服务

  1. 要提供HTTP服务最好使用80端口。
  2. 要提供HTTPS服务最好使用443端口。
  3. 要使用FIP服务最好使用21端口。
  4. 一共有65535个端口。
端口使用规则
  1. 0到1023号端口是留给系统用的,你只有拥有了管理员权限后,才能使用这1024个端口。
  2. 其他端口可以给普通用户使用。
  3. http-server默认使用8080端口。
  4. 如果端口被占用,那么只能换一个端口。

使用hs -c-1 -p 1234命令在本地启动一个端口,可以使用该端口进入页面。
如图所示:


\quad这个123.html是我桌面上新建的html文件。这时候我重新开一个git bash,再使用前面的命令,就能看到端口被占用的报错:

总而言之,对于端口和IP记住一句话:端口和IP缺一不可。

4.域名、路径、查询参数、锚点

4.1 域名

域名就是对IP的别称,查看百度对应的IP:

$ ping baidu.com
正在 Ping baidu.com [220.181.38.148] 具有 32 字节的数据:

这个IP很可能不一样,原因在于:

  1. 一个域名可以对应不同的IP,这个叫负载均衡,防止一台机器扛不住。
  2. 一个IP可以对应不同的域名,这个叫共享主机
  • 域名和IP是如何对应起来的呢?

\quad 首先当我们在浏览器中输入baidu.com并且按下回车的时候,浏览器会向(电信/联通)提供的DNS服务器询问baidu.com对应什么IP,(电信/联通)会回答一个IP,然后浏览器才会向对应的(80/443)端口发送请求,请求的内容是是查看baidu.com的首页。如图所示:

\quad 也可以手动设置DNS地址,(win10)步骤:打开网络和Internet选项->以太网->更改适配器选项->选中自己常用的网络鼠标右键属性->Internet协议版本4(TCP/Ipv4)

  1. com是顶级域名。(com是company的缩写)
  2. xxxxx.com是二级域名。(俗称一级域名)
  3. www.xxxxx.com是三级域名。(俗称二级域名)
  4. 他们之间是父子关系,所以xxxxx.com与www.xxxxx.com很有可能不是一家公司。

4.2 路径、查询参数、锚点

弄清楚这样几个问题:

  • 同一台服务器上如何请求不同的页面?
    使用不同的路径:
    https://developer.mozilla.org/zh-CN/docs/Web/CSShttps://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#教程
    注意:
  1. 锚点看起来有中文但实际不支持中文,过程中会被编码成其他字符。
  2. 由于锚点是不会传给服务器的,所以锚点是无法在Network面板看到的。
  • 最终我们可以得出结论:
    URL=协议+域名或者IP+端口号+路径+查询字符串+锚点
    端口号默认80/443被省略了。

4.3 curl命令

  • 使用curl命令发送http请求
    例如:

curl https://www.baidu.com/命令发起http请求:

curl -v https://www.baidu.com/命令显示细节:

\quad从响应的内容中可以看出,这个过程是先根据url,请求DNS得到对应的IP,然后进行TCP连接,连接成功再发起HTTP请求。相应结束后关闭TCP连接,实现真正的结束。

  • 使用curl 命令发起POST请求 \quad 在参数中增加 -X POST,例如:
 curl -v -X POST -d 'username=zhangsan' https://localhost:8888/
  • 发起curl请求,指定请求头 \quad 在参数中增加-H 'Name:value' 例如:
curl -v -X POST -H 'Accept:text/html' https://localhost:8888/

5. 参考资料