网络知识(一)

196 阅读8分钟

以下均为个人简单总结,欢迎指正

一、TCP/UDP

(一)TCP/UDP的概念

1.TCP(传输控制协议)

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

2.UDP(用户数据报协议)

用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连的传输层协议,提供面向事务的简单不可靠信息传送服务。

(二)TCP/UDP的区别

  1. 连接方面

TCP面向连接(如打电话要先拨号建立连接)。

UDP是无连接的,即发送数据之前不需要建立连接。

2.类型方面

TCP面向字节流,TCP中的“流”指的是流入到进程或从进程流出的字节序列。

UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。

  1. 安全方面

TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。

UDP尽最大努力交付,即不保证可靠交付。

  1. 传输效率

TCP传输效率相对较低。

UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

  1. 连接对象数量

TCP连接只能是点到点、一对一的。

UDP支持一对一,一对多,多对一和多对多的交互通信。

6.拥塞控制方面

UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低,符合很多实时应用(如IP电 话、实时视频会议等)的要求。

7.首部开销

UDP首部开销小,只有8个字节,比TCP的20个字节的首部更短。

二、三次握手

(一)TCP三次握手的过程

  1. 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
  2. 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
  3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。 三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

来一张图理解一下:

image.png

再来个形象一点的图:

image.png

(二)为什么是三次握手,不是四次、两次?

  1. 为什么不是两次握手? 有这样一种情况,当A发送一个消息给B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A会认为这个消息丢失了,然后重新发送消息。

当A和B通信完成后,这个被A认为失效的消息,到达了B 对于B而言,以为这是一个新的请求链接消息,就向A发送确认, 对于A而言,它认为没有给B再次发送消息(因为上次的通话已经结束)所有A不会理睬B的这个确认,但是B则会一直等待A的消息,这就导致了B的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了。

第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判。

  1. 为什么不是四次握手? 通过三次握手确认双方收发功能都正常,四次也可以但是显得比较多余。

三、四次挥手

(一)TCP四次挥手的过程:

对于一个已经建立的连接,TCP使用改进的四次挥手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下:

  1. 当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
  2. 主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
  3. 主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
  4. 主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

image.png

(二)为什么是四次挥手?

因为TCP是一个全双工协议,必须单独拆除每一条信道。4次挥手的目的是终止数据传输,并回收资源,此时两个端点两个方向的序列号已经没有了任何关系,必须等待两方向都没有数据传输时才能拆除虚链路,不像初始化时那么简单,发现SYN标志就初始化一个序列号并确认SYN的序列号。因此必须单独分别在一个方向上终止该方向的数据传输。

如果是三次挥手,会怎么样?

三次的话,被动关闭端在收到FIN消息之后,需要同时回复ACK和Server端的FIN消息。如果Server端在该连接上面并没有Pending的消息要处理,那么是可以的,如果Server端还需要等待一段时间才可以关闭另外一个方向的连接,那么这样的三次挥手就不能满足条件。

后期会整理出一些三次握手和四次挥手的相关面试题,敬请期待

四、http和https

(一)http和https的概念

1. http(超文本传输协议)

超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

2. https

HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

PS:TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。

(二)http和https的区别

  1. 安全性

HTTP 明文传输,数据都是未加密的,安全性较差,

HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。

  1. CA认证

使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。

3.响应速度

HTTP 页面响应速度更快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,

HTTP 页面响应速度更慢,HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。

4.连接方式和端口

http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。

5.服务器资源耗费

HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

五、http请求跨域问题

(一)什么是跨域请求?

本质来说,跨域请求和普通HTTP请求并没有不同,而是因为浏览器的同源策略导致的一部分特殊请求成为了跨域请求。

那首先看看什么是“域”:其实“域”就是同源的“源”,那就牵扯到什么是同源

同源就是地址的协议、域名、端口都相同,只要有一个不同就不同源,就要处理跨域了。

那大家就会疑惑,为什么会出现同源策略呢?

Mozila官方解释:同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

简单来说同源政策就是为了保证用户信息的安全,防止恶意的网站窃取数据。

所以处理跨域就是为了避开浏览器的安全限制

那浏览器中除了HTTP请求需要遵守“同源策略”以外,还有那些需要遵守同源策略呢?

  1. Cookie、LocalStorage 和 IndexDB 无法读取。
  2. 获取DOM对象(一个“域”下的脚本无法获取另一个域下的DOM对象)
  3. Ajax请求(也就是跨域的HTTP请求)

如何规避这三种限制可以查看阮一峰的网络日志

那有哪些是不受同源策略限制的呢?

  1. 页面上的链接,比如 a 链接。
  2. 重定向。
  3. 表单提交。
  4. 跨域资源的引入,比如:script, img, link, iframe。

(二)怎么决跨域请求?

  1. 通过jsonp跨域
  2. document.domain + iframe跨域
  3. location.hash + iframe
  4. window.name + iframe跨域
  5. postMessage跨域
  6. 跨域资源共享(CORS)
  7. nginx代理跨域
  8. nodejs中间件代理跨域
  9. WebSocket协议跨域 详细操作、原理参见博客