小林coding——网络篇

  • TCP/IP网络模型

    • 包含应用层,传输层,网络层,数据链路层,物理层
    • 应用层:用户直接接触到的,应用软件实现在应用层。应用层工作在操作系统的用户态。
    • 传输层:为应用层提供网络支持,不负责传输数据,有TCP/UDP两个传输协议。TCP报文中携带了端口号,区分是哪个应用进程在传输数据。
    • 网络层:负责传输数据。IP协议。
      • IP协议的作业:寻址-->找到要传输到哪一台设备上(目的地去哪儿?);路由-->两台设备之间可能有很多条网络路径,数据包到达一个网络节点时,根据算法决定接下来走哪一条网络路径(去目的地应该怎么走?)。
      • IP头部包含了源地址和目的地址
    • 数据链路层:数据需要跨网络传输时,需要一个设备在两个网络之中,这个设备就是路由器。
      • 数据链路层用来标识网络中的设备
      • 为网络层提供链路级别的服务
    • 物理层:将数据包转化为电信号,让其可以在物理介质中传输。
  • HTTP(超文本传输协议)

    • 一个在计算机世界中在【两点】之间【传输】文字图片音频视频等【超文本】数据的【约定和规范】
    • 五大类状态码:1** --> 提示信息,协议处理中间状态;2** --> 处理成功;3** --> 重定向,资源位置发生变动,需要重新发送请求;4** --> 客服端错误,请求的报文有误,服务器无法处理;5** --> 服务器处理,服务器处理请求时内部错误。
    • http的优点:简单灵活,易于扩展,应用广泛,跨平台
    • 缺点:无状态(Cookie可以记录状态,用于解决无状态问题)。明文传输不安全,内容可能会被监听,不验证通信方的身份(遭遇伪装),无法验证报文的完整性(内容可能会被篡改)。
    • HTTP的安全问题可通过HTTPS解决(通过引入SSL/TLS层)
    • 早期的http1.0:
      • 每发起一个请求都要建立一次TCP三次握手,增加了通信开销
      • 串行机制,请求A发出并收到服务器响应之后,请求B才能发出
    • http1.1

      • 提出了长连接方式,持久连接,减少了TCP重复连接和断开的额外开销,减轻了服务端的负载
      • 管道机制,只要请求A发出后,不用等待其回来,请求B可以继续发出。减少了整体响应时间
      • 还是存在着队头堵塞问题,服务器对A的请求未响应,则请求B及以后的请求都阻塞住,客户端一直无法请求到数据。
      • 请求响应头部信息未经压缩就发送,首部信息越多延迟越大
      • 发送了冗长的首部,并且很多请求中发送了相同的首部,浪费较多。
      • 请求只能从客户端开始,服务器只能被动响应
      • 如何优化HTTP1.1?(三个思路:避免发送http请求;要发送http请求时,减少请求次数;减少服务器响应数据大小)
        • 避免发送http请求:使用缓存机制
        • 减少http请求次数:减少重定向次数,合并请求(减少重复发送的http头部信息,减少TCP建立连接的次数),延迟发送请求(按需获取)
        • 减少服务器响应的数据大小:无损压缩,有损压缩
    • http2

      • HPACK算法进行头部压缩,消除重复部分
        • 静态字典,动态字典,Huffman压缩算法
      • 二进制格式传输
        • 二进制帧
      • 多路复用解决队头阻塞,并发传输
      • 服务器主动推送消息
    • http3(未普及)

      • 将http2中将HTTP下层的TCP改成了UDP
  • HTTP和HTTPS的区别
  • TLS1.2四次握手
    • 第一次握手:客户端发送【Client Hello】信息,携带了客户端的TLS版本号,一个随机数(Client Random),支持的密码套件列表
    • 第二次握手:服务器收到【Client Hello】信息后,返回【Server Hello】消息,里面携带了确认的TLS版本,服务器生成的随机数(Server Random),选择的一个合适的密码套件。然后服务器发送【Server Certificate】消息,里面携带了数字证书信息。最后发送【Server Hello Done】消息,表示本次发送完毕
    • 第三次握手:客户端验证证书有效之后,生成一个新的随机数(pre-master),数字加密后通过发送【Change Cipher Key Exchange】消息给服务器。服务器收到解密之后,双方根据共享的三个随机数生产会话密钥(用于解密后续传输的加密数据),然后客户端发送【Change Clipher Spec】告诉服务器开始使用加密传输。最后客户端发送【Encrypted Handshake Message】消息,用于验证加密通信和解密是否可用。
    • 第四次握手:服务器发送【Change Clipher Spec】和【Encrypted Handshake Message】消息,同样用于验证加密通信和解密是否可用。
    • 最后用【会话密钥】加密和解密http的通信
  • 如何优化HTTPS?
    • 相比于HTTP, HTTPS的性能消耗多了两个方面:1.TLS协议握手过程;2.握手后的对称加密报文传输
  • TCP

    • TCP头部格式
    • 客户端和服务端建立一个TCP连接需要达成三方面信息的共识:socket(IP地址和端口号等),序列号(解决乱序问题等),窗口大小(用于流量控制)
    • TCP三次握手
      • 第一次握手:一开始服务器处于监听(LISTEN)状态,客户端随机初始化序列号(client_isn),同时将SYN位置为1表示希望建立连接。将这个SYN报文发送给服务器端,之后客户端处于SYN-SENT状态。
      • 第二次握手:服务器收到客户端发送的SYN报文后,初始化了服务端的序列号(server_isn),在确认应答号处填入client_isn+1,然后将SYN和ACK位置为1,然后发送给客户端,随后服务端处于SYN-RCVD状态
      • 第三次握手:客户端收到服务端报文之后,将ACK置为1,确认应答好设置为server_isn+1,然后发送给服务端,此次发送的报文可以携带服务器数据之后,客户端处于ESTABLISHED状态,服务端收到之后也进入ESTABLISHED状态
      • 为什么是三次握手,不是二次或者四次?
        • 三次握手才可以防止旧的重复连接初始化造成的混乱(主要原因)
        • 三次握手才可以同步双方的初始序列号
        • 三次握手才可以避免资源浪费
    • TCP四次挥手
      • 第一次挥手:假如客户端准备断开连接,首先会发送一个FIN位置为1的TCP头部的FIN报文给服务端,然后客户端进入FIN_WAIT_1状态
      • 第二次挥手:服务器收到FIN报文后,向客户端发送ACK应答报文,然后服务端进入CLOSED_WAIT状态,客户端收到应答报文之后,进入FIN_WAIT_2状态,等待服务端处理完数据,然后向客户端发送FIN报文,之后服务端进入LAST_ACK状态
      • 第三次挥手:客户端收到收到FIN报文之后,回一个ACK应答报文,然后进入TIME_WAIT状态
      • 第四次挥手:服务端收到ACK应答报文,进入CLOSED状态,此时服务器端完成了连接的关闭;客户端在经过一段时间(一般是TIME_WAIT状态持续2MSL(报文最大生存时间,Linux中1MSL为30s))等待后也自动进入CLOSED状态,此时客户端也完成了连接的关闭。
      • 两端各发送了一个FIN和ACK报文;主动关闭连接的才有TIME_WAIT状态
      • 为什么TIME_WAIT持续2MSL?
        • 1.防止旧连接的数据包;2.保证被动关闭连接的一方能够正确的关闭,即保证最后的ACK报文能被服务器接收到,从而使其正确地从LAST_ACK状态进入CLOSED状态。
      • 为什么挥手需要四次?
        • 挥手过程需要先把正在处理的数据处理完成,所以服务器端中途会等待一段时间之后再发生FIN报文,所以成了四次。
    • TCP重传机制(通过序列号和确认应答号实现可靠传输)
      • 超时重传(时间RTO设置很重要)
      • 快速重传
    • 滑动窗口
    • 流量控制
      • 让「发送⽅」根据「接收⽅」的实际接收能⼒控制发送的数据量,防止处理不过来而导致重传
    • 拥塞控制
  • IP网络层

    • MAC 的作⽤:实现「直连」的两个设备之间通信, IP :负责在「没有直连」的两个⽹络之间进⾏通信传输
    • 数据传输过程中,源IP地址和目的IP地址一直未变化,而源MAC地址和目的MAC地址会变化。
    • DNS域名解析(将域名解析为具体的IP地址)
      • 当浏览器键入一个域名时,首先会查看浏览器缓存是否有该域名的IP地址,如果没有则询问操作系统的缓存,如果没有就检查本地域名解析文件hosts,如果还是没有就会使用DNS故武器进行查询:
    • ARP协议:借助主机广播ARP请求和接收APR响应的包确定下一级的MAC地址(已知IP地址求MAC地址)
    • RARP协议:已知MAC地址求IP地址
    • DHCP:最常用的,用来动态获取IP地址
  • 浏览器中键入一个URL链接到显示网页发生了什么?
    • 浏览器解析URL,确定要访问的Web服务器名和文件名,
    • 然后询问DNS服务器查询访问地址的IP地址,然后生成HTTP信息委托给操作系统进行发送,
    • 建立TCP三次握手连接,数据长度大于MISS长度时进行TCP分割数据,然后生成TCP报文(TCP头部+HTTP报文+数据)
    • 委托IP模块将数据封装成网络包进行发送:生成IP报文(里面有源和目的IP信息进行寻址);生成MAC头部进行路由,发送给下一个路由器(里面有源和目的MAC信息进行路由),此时就是MAC头部+IP头部+TCP头部+HTTP报文+数据
    • 网络包只是一堆二进制文件,需要网卡转换为电信号才能在网线传输(这才是真正的发送)select
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值