虎牙
1.浏览器工作原理:从 URL (huya.com)输入到页面展现到底发生了什么?
-
服务器端监听:
- 服务器启动了 http 服务进程,这个 http 服务的守护进程(daemon),可能是 Apache;
- 这个 http 服务进程开始定位到服务器上的 www 文件夹(网站根目录),一般是位于 /var/www
- 启动php模块,向操作系统申请了一个 tcp 连接,然后绑定在了 80 端口,调用了 accept 函数,开始了默默的监听,监听着可能来自位于地球任何一个地方的请求,随时准备做出响应。
-
URL 解析/DNS 查询:
- http协议默认端口号是80。不指定端口号就使用默认。
- 浏览器对 URL 进行检查时首先判断协议,如果是 http/https 就按照 Web 来处理
- 如果地址不是一个IP地址而是域名则通过DNS(域名系统)将该地址解析成IP地址。IP地址对应着网络上一台计算机,DNS服务器本身也有IP,你的网络设置包含DNS服务器的IP。
-
DNS递归查询IP,DNS缓存->极限域名服务器(huya.com)->顶级域名服务器(com)->根域名服务器
-
应用层客户端发送HTTP请求:
- 得到 IP 地址后,浏览器会开始生成一个 HTTP 请求,应用层客户端向服务器端发送的HTTP请求包括:请求报头和请求主体两个部分
-
传输层TCP传输报文:
- 应用层的 HTTP 请求准备好后,浏览器会在传输层发起一条到达服务器的 TCP 连接。
- 为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地还原报文信息。
- 三次握手,TCP协议保证传输安全可靠。
- “三次握手”的过程是,发送端先发送一个带有SYN(synchronize)标志的数据包给接收端,在一定的延迟时间内等待接收的回复。接收端收到数据包后,传回一个带有SYN/ACK标志的数据包以示传达确认信息。接收方收到后再发送一个带有ACK标志的数据包给接收端以示握手成功。在这个过程中,如果发送端在规定延迟时间内没有收到回复则默认接收方没有收到请求,而再次发送,直到收到回复为止。
-
网络层IP协议查询MAC地址:
- IP协议的作用是把TCP分割好的各种数据包封装到IP包里面传送给接收方。
- 而要保证确实能传到接收方还需要接收方的MAC地址,也就是物理地址才可以,IP地址和MAC地址是一一对应的关系,一个网络设备的IP地址可以更换,但是MAC地址一般是固定不变的。ARP协议可以将IP地址解析成对应的MAC地址。
- 当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标,在中转的过程中需要通过下一个中转站的MAC地址来搜索下一个中转目标。
-
数据到达数据链路层:
在找到对方的MAC地址后,已被封装好的IP包再被封装到数据链路层的数据帧结构中,将数据发送到数据链路层传输,再通过物理层的比特流送出去。这时,客户端发送请求的阶段结束。
-
服务器接收数据:
接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程中包括在传输层通过TCP协议将分段的数据包重新组成原来的HTTP请求报文。
-
服务器响应请求并返回相应文件:
- 服务接收到客户端发送的HTTP请求后,服务器上的的 http 监听进程会得到这个请求,然后一般情况下会启动一个新的子进程去处理这个请求,同时父进程继续监听。
- 返回一个标准的 http 响应包,再通过 tcp ip 协议,送回到客户机浏览器。
- 浏览器开始处理数据信息并渲染页面
2.进程间通信
- 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
- 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
- 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
- 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
- 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
3. udp链表
4.构造函数、copy构造函数和析构函数可以是虚函数吗?
构造函数不能是虚函数
base类的析构函数一定是虚函数