Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2020-04-24日计划: 进程、线程、ip、tcp、http #15

Open
sl1673495 opened this issue Apr 25, 2020 · 5 comments
Open

2020-04-24日计划: 进程、线程、ip、tcp、http #15

sl1673495 opened this issue Apr 25, 2020 · 5 comments

Comments

@sl1673495
Copy link
Owner

sl1673495 commented Apr 25, 2020

进程

http://blog.poetries.top/browser-working-principle/guide/part1/lesson01.html

  1. 一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。

  2. 当一个进程关闭之后,操作系统会回收进程所占用的内存。

  3. 进程之间的内容相互隔离。如果需要通信,则要用到「进程间通信(IPC)」的机制。

线程

  1. 线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率。

  2. 进程中的任意一线程执行出错,都会导致整个进程的崩溃。

  3. 线程之间共享进程中的数据。
    image

@sl1673495
Copy link
Owner Author

sl1673495 commented Apr 25, 2020

IP

IP 的目的是把数据包送到目标主机。

如果要想把一个数据包从主机A发送给主机B,那么在传输之前,数据包上会被附加上主机B的IP地址信息,这样在传输过程中才能正确寻址。

额外地,数据包上还会附加上主机A本身的IP地址,有了这些信息主机B才可以回复信息给主机A。这些附加的信息会被装进一个叫IP头的数据结构里。

IP头是IP数据包开头的信息,包含IP版本、源IP地址、目标IP地址、生存时间等信息

image

@sl1673495
Copy link
Owner Author

sl1673495 commented Apr 25, 2020

UDP:把数据包送达应用程序

UDP中一个最重要的信息是端口号,端口号其实就是一个数字,每个想访问网络的程序都需要绑定一个端口号。UDP通过端口号把数据包分发给正确的程序。

和IP头一样,端口号会被装进UDP头里面。

UDP没有重传机制。虽说UDP不能保证数据可靠性,但是传输速度却非常快,所以UDP会应用在一些关注速度、但不那么严格要求数据完整性的领域,如在线视频、互动游戏等

@sl1673495
Copy link
Owner Author

TCP:把数据完整地送达应用程序

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相对于UDP,TCP有下面两个特点:

对于数据包丢失的情况,TCP提供重传机制;
TCP引入了数据包排序机制,用来保证把乱序的数据包组合成一个完整的文件。

和UDP头一样,TCP头除了包含了目标端口和本机端口号外,还提供了用于排序的序列号,以便接收端通过序号来重排数据包。

三次握手建立连接 -> 传输数据 -> 四次挥手断开连接。

到这里你应该就明白了,TCP为了保证数据传输的可靠性,牺牲了数据包的传输速度,因为“三次握手”和“数据包校验机制”等把传输过程中的数据包的数量提高了一倍。

@sl1673495
Copy link
Owner Author

sl1673495 commented Apr 25, 2020

浏览器端发起HTTP请求流程

  1. 构建请求
    首先,浏览器构建请求行信息(如下所示),构建好后,浏览器准备发起网络请求
    GET /index.html HTTP1.1

  2. 查找缓存
    在真正发起网络请求之前,浏览器会先在浏览器缓存中查询是否有要请求的文件。

  3. DNS查询拿到IP地址

  4. 建立TCP连接
    Chrome有个机制,同一个域名同时最多只能建立6个TCP连接,如果在同一个域名下同时有10个请求发生,那么其中4个请求会进入排队等待状态,直至进行中的请求完成。当然,如果当前请求数量少于6,会直接进入下一步,建立TCP连接。

  5. 发送HTTP请求

    1. 首先浏览器会向服务器发送请求行,它包括了请求方法、请求URI(Uniform Resource Identifier)和HTTP版本协议。
    2. 还要以请求头形式发送其他一些信息,把浏览器的一些基础信息告诉服务器。

服务器响应HTTP请求

  1. 返回请求
    首先服务器会返回响应行,包括协议版本和状态码。
    随后,正如浏览器会随同请求发送请求头一样,服务器也会随同响应向浏览器发送响应头。响应头包含了服务器自身的一些信息。
    发送完响应头后,服务器就可以继续发送响应体的数据。

  2. 断开连接
    通常情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接。除非浏览器或者服务器在其头信息中加入了:
    Connection:Keep-Alive

  3. 重定向
    响应行返回的状态码是301,状态301就是告诉浏览器,我需要永久重定向到另外一个网址,而需要重定向的网址正是包含在响应头的Location字段中。

@sl1673495
Copy link
Owner Author

sl1673495 commented Apr 25, 2020

浏览器缓存

1. 强缓存

服务端对于请求的资源,返回了 cache-control: max-age=2000,就说明服务端告诉客户端:“这个资源在2000秒内你使用本地的就可以了,不用来找我要”。

下次再发起相同的请求时,客户端判断时间没有过期的话,就直接从本地获取缓存的资源了。

强缓存是不经过服务端的。

2. 协商缓存

服务端对于请求的资源,会用hash算法计算出一个值,然后通过ETag字段返回在响应头里告诉客户。服务端在资源更新后,要实时更新这个 ETag 值。

客户存储到这个值后,通过请求头附加 If-None-Match 字段带上这个 ETag,即可让服务端确认这个资源是否有更新。

如果没有更新的话,则返回 304 not modified,告知客户端可以继续使用缓存资源。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant