OSI七层与TCP/IP

149 阅读4分钟

成千上万的计算机如果要保证他们不打架和平相处,就需要复杂的协议⽀撑。⼀个复杂问题通常的解决⽅式就是分层解决。

  • OSI参考模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
  • TCP/IP分层模型:网络接口、网络层(ip)、传输层(tcp、udp)、应用层(http)

IP协议

在⼏⼗年前,没有互联⽹。为了让不同局域⽹的计算机能连接起来,IP 协议出现。它定义每个在互联⽹上的设备都有⼀个 IP 地址,由 32 位,4 个字节组成。最常⻅的形式是,每个字节⽤⼗进制表示,例如 00000010 => 2,11000000 => 192,然后每个字节⽤"."分开,所以IP地址都是⽤形如 192.168.0.1 来表示的。 当设备联上互联⽹分配到⼀个 IP 地址后,就可以给其它机器发数据了,⽐如给QQ的服务器发消息,或者给⽹易的服务器发邮件。在 IP 层,数据是按 Packet (报⽂)为单位传输的,报⽂在路由器、交换机的帮助下,在各个⼤⼩⽹络之间穿梭,最终到达⽬标地址。

IP Packet 可以看作两⼤部分,⼀是Data,实际传输数据,⽐如说⼀张图⽚。Data 以外的统称Header,它包含了很多信息,例如第⼀个字节 Version 表示协议的版本,Source address 和 Destination address 表示来源 IP 地址,⽬标 IP 地址。

另外 IP 协议有⼏个值得注意的特点: 1. 只作“尽最⼤努⼒的交付”,就是说我们发出去的 IP 报⽂可能在某个中转路由器丢了 2. IP 报⽂的到达不能保证顺序,可能我发过去是报⽂1、报⽂2,但对⽅接收到的是报⽂2、报⽂1 3. IP 协议是⽆连接的,在发送数据前,不需要先打招呼,直接丢过去就是了。

这⼏个特点对于应⽤开发者来说是⾮常不⽅便的,所以⼈们在 IP 层上定义了⼀个新的协议(TCP协议),⽤来解决这些问题。

NOTE: 上⽂是基于应⽤最⼴泛的 IPv4 描述的。 IPv6 是 IPv4 的进化版,解决了 IPv4 的⼏个痛点问题,⽐如地址空间不够⽤了,传输效率不⾼等。

  • IP地址 地址⻓度:
  • IPv4协议具有32位(4字节)地址⻓度
  • IPv6协议具有128位(16字节)地址⻓度;

-TCP协议- 实现⼀个即时通讯IM

Socket实现 原理:Net模块提供⼀个异步API能够创建基于流的TCP服务器,客户端与服务器建⽴连接后,服务器可以获得⼀个全双⼯Socket对象,服务器可以保存Socket对象列表,在接收某客户端消息时,推送给其他客户端。

端口:⼀台主机上运⾏着多个程序,哪个报⽂应该交给哪个程序阅读,是⼀个问题。 TCP 和 UDP 都在传输层这⼀层抽象出了 ports 端⼝的概念。

  • 端⼝号 2^16 = 65536 个端⼝,端⼝编号范围为 0 - 65535。
  • 前8000个端⼝需要申报
  • 某个域名最多只允许同时建⽴6条连接 ,就是将资源放不到不同的域名下,以突破浏览器的针对单个域名的并 发连接限制
  • HTTP2可以解决上⾯的问题

TCP的三次握⼿与四次挥⼿

  • 客户端想要发送数据给服务端,在发送实际的数据之前,需要先在两端之间建⽴连接,数据发完以后也需要将该连 接关闭。建⽴连接的过程就是我们常说的 TCP 三次握⼿:
    1. 客户端发送⼀个 SYN 告诉服务端它想建议⼀个连接,SYN 代表 Sychronize,意为同步
    1. 服务端收到 SYN 后,返回⼀个 SYN-ACK,ACK 代表 Acknowledge,意为确认
    1. 客户端最后发送⼀个 ACK,服务端收到时,标识着三次握⼿的完成,这之后就可以愉快地传输数据了 由此可⻅,三次握⼿的时间消耗为⾄少⼀个 RTT(Round Trip Time),即⽹路上⾄少⼀个来回,⼤部分时候这意味着⼏百毫秒的时间,如果服务器在国外或者客户端⽹络不好,RTT 超过⼀秒也完全是有可能的。 这也解释了为什么我们在谈前端优化的时候,经常提到要减少建⽴ TCP 连接(减少请求)

优化方案:精灵图这种合并图⽚以减少 HTTP 请求的技术,本质上是为了减少建⽴多个 TCP 连接带来的性能损耗 HTTP/2 ⾥,由于对单个 TCP 连接的多路复⽤,⽆需建⽴多个 TCP 连接