抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

网络

网络层

传输层

  • TCP、UDP

    • 特点

      • UDP:无连接,尽最大可能交付数据,面向报文,支持一对一、一对多、多对一、多对多的交互通信,不可靠(快、实时性好)

        • DNS、TFTP
      • TCP:面向连接,可靠交付,有流量控制、拥塞控制,全双工通信,面向字节流,只能点对点(一对一)

        • HTTP、FTP、TELENT、SMTP
    • TCP三次握手

      • 防止失效的连接请求到达服务器,导致服务器打开无用的连接
    • TCP四次挥手

      • TIME_WAIT=2MSL

        • 确保最后一个确认报文能到达,因为如果丢失会重传
        • 让本次连接产生的所有报文都从网络中消失
    • TCP可靠传输

      • 超时重传RTT
    • TCP滑动窗口

    • TCP流量控制

      • 控制发送方速率,保证接收方来得及接收(通过确认报文的窗口字段控制发送方窗口大小)
    • TCP拥塞控制

      • 慢启动、拥塞避免、快重传、快恢复

应用层

  • DNS

    • UDP+TCP
  • DHCP

    • 动态主机配置
  • Web页面请求过程

      1. DHCP配置主机信息
      1. ARP解析MAC地址
      1. DNS解析域名
      1. HTTP请求页面
      • 三次握手建立连接
      • 开始通信

Socket

阻塞式I/O

  • 直到数据从内核缓冲区复制到应用进程缓冲区才返回(cpu并不会阻塞,其他进程还可以执行,cpu利用率较高)

非阻塞式I/O

  • 应用进程执行系统调用后内核返回一个错误码,需要轮询来获知IO操作是否完成(CPU利用率低)

I/O多路复用

  • select、poll等待数据,当监听的某个套接字可读,再使用recvfrom把数据从内核复制到进程中

    • select

      • 会修改fd,默认只能监听少于1024个,轮询
    • poll

      • 提供了更多的事件类型,对fd的重复利用更高
    • epoll

      • 比上述两种更加灵活,对多线程更友好

        • epoll_create

          • 创建一个epoll句柄
        • epoll_ctl

          • 为fd注册事件并绑定一个回调函数,当设备就绪callback把fd加入就绪队列(列表)
        • epoll_wait

          • 轮询就绪队列(schedule_timeout())

信号驱动I/O

  • sigaction系统调用,当数据到达时内核会向进程发送SIGIO信号,收到信号后调用recvfrom(相比轮询的非阻塞I/O模型CPU利用率更高)

异步I/O

  • aio_read系统调用,内核会在数据复制完成后向应用进程发送信号(注意和信号驱动I/O的区别)

HTTP

HTTP状态码

  • 1xx:信息性

  • 2xx:成功

  • 3xx:重定向

    • 301:永久重定向,会缓存
    • 302:临时重定向,不缓存,有url劫持问题
  • 4xx:客户端错误,服务端无法处理的请求

  • 5xx:服务器错误

  • 客户端保存状态

Session

  • 服务器保存状态

HTTPS

  • HTTP+SSL
  • 使用非对称加密协商对称加密使用的Secretkey
  • 使用Secretkey对称加密数据
  • 使用数字证书保证公钥的正确性

HTTP2.0

  • 二进制分帧层
  • 服务端推送
  • 首部压缩

【参考文章】GitHub-CyC2018/CS-Notes

评论