OSI五层模型(开放式系统互联通信参考模型)

1,035 阅读5分钟

image.png

传输控制层

tcp连接建立过程:

  1. 首先服务器监听8080端口
  2. 然后是三次握手
  3. 三次的目的是确保双方发送和接受都没问题

socket是什么:

socket就是一个四元组,保证唯一性

什么是四元组?

  • 首先,一个服务器是不是可以接受很多客户端的链接
  • 在复杂的网络通讯当中,服务器如何正确地响应给发送请求的客户端?
  • 四元组就是通讯过程中的 ip+port 、 ip+port,一对ip和端口,四个节点中肯定有一个是不一样的,就能确保唯一 port是端口号,端口号取值范围 65535

一个进程,理论上最多可以跟服务器建立多少个连接?

  • 应该是65535个连接,那么这个时候服务端消耗多少个端口号?
  • 就是一个8080,那么客户端又会消耗多少端口号?65535个

比如一个进程进行两个连接

  1. IPA+123端口 --> IPB+8080端口
  2. IPA+321端口 --> IPB+8080端口
  • 四元组里面有一个不一样,就说明是一个不同的socket

那么一个进程能不能对一个服务器进行十万连接的测试?

  • 不能,因为只有65535个端口,但是如果你有两个网卡,就是两个ip地址就可以。

网络层

  • 互联网由很多局域网组成
  • 局域网里面多个网络号由路由器连接
  • 网络号里面有多个主机

主机

主机一般有四个维度

  1. ip地址:ipaddr = 192.168.150.11
  2. 掩码:netmask = 255.255.255.0
  3. 网关:gateway = 192.168.150.2
  4. dns1 = 223.5.5.5、dns2 = 114.114.114.114 <稍后补充dns是什么------->

掩码做什么用?

  • ip地址和掩码做二进制的与运算,可以得到网络号。
  • 比如 192.168.150.11 和 255.255.255.0 做与运算就得到 192.168.150.0.
  • 这个结果叫网络号,那11是什么?代表在192.168.150.0里面,你是第11号机器。

什么是路由表?

  • 互联网里面是不是有很多计算机、笔记本、服务器接入这个网络,那么其中任何一个设备想和另外的设备通讯的话,我的数据包从我的主机发出去,要怎么到对方呢?
  • 那么我做一个表格,把互联网上所有人的ip地址记下来,这个表格是不是会及其庞大?记下来以后,当你想发个某一个的时候,他们之间应该怎么走?是不是有一个图计算、路径计算的过程?
  • 所以我们不可能使用这种记录全部的,那么我们怎么才能保证通讯呢?
  • 比如说,在我的局域网里面,有一台机器。我只要把局域网连接外网的这个点记上,我把数据给他就不管了,他往下一个点扔,这个就是下一跳机制,下一跳代表的就是网关。
  • 什么是路由表?路由表就是用来支持下一跳的。

路由表有些什么

image.png

  1. 路由表第一个条目:
  • 目的地:192.168.150.0,这台主机植入了150的局域网
  • 网关:四个0,代表局域网内不需要中间人,数据包直接从eth0发出去,通过交换机就可以交换给网络,中间不需要路由跳板。
  • 掩码:255.255.255.0
  • Iface:接口是以太网0号网卡
  1. 路由表第二个条目:
  • 地址:四个0
  • 网关:192.168.150.2 有地址了,这个就是家里路由器地址

ping一下百度,发生了什么?

image.png

  1. 220.187.38.150是百度的ip地址
  2. 拿目标ip地址和路由表每个条目的掩码做与运算
  3. 220.187.38.150&255.255.255.0 -> 220.187.38.0
  4. 拿到结果与目的地(192.168.150.0)去匹配,不一样,这个条目就被丢弃了,换下一个
  5. 来到最后一行,掩码四个0与运算还是四个0,目的地一致,这个时候,数据交给谁?
  6. 交给下一跳(网关192.168.150.2)

ping局域网内ip发生了什么?

image.png

  • 和第一条做与运算,得到结果和目的地一样,
  • 不需要网关路由,直接从eth0接口发出去了,
  • 这就是内网内不需要下一跳的原因。

重点来了,ping百度的时候,走最后的条目,找到下一跳的ip地址,这个时候,我的目标ip地址,是放百度的ip地址,还是下一跳的ip地址?
放了百度的ip地址,怎么跳到下一跳呢?这里涉及到了另一个层,链路层

链路层

  • 链路层会再套一层地址,套的是192.168.150.2所在网卡的硬件地址
  • 他也有个arp表

image.png

客户端访问百度的过程

image.png

  • 客户端交给路由器,
  • 路由器发现mac地址是我的,目标地址不是我的,修改mac地址,叫给下一跳,
  • 运营商发现也不是我的,最后交到服务器,
  • 服务器发现mac地址和目标都是我的,接收,找端口号,端口号找进程,进程处理,返回
  • 原路返回

数据发送的过程中,目标地址一层不变,变的是链路层的mac地址

总结一下:

  1. 应用层:我想连接发点东西,阻塞,交个内核
  2. 传输控制层:内核发一个握手包,阻塞
  3. 网络层:我找到下一个网关了 ,网关地址是xxx,阻塞,你知道网关的mac地址
  4. 链路层:如果知道,封包发出去了,如果不知道,说明没有请求arp表
  • 如果不知道,会发生一件什么事情?
  • 全阻塞,链路层会先走,arp广播一下请求链路层的mac地址,回去再封一个握手包发出去。
  • 完整的请求中,如果链路表是空的,触发网络行为的时候,会先请求链路表,所以先看到的是网卡中有arp请求,然后再看到三次握手,再看到数据传输,再看到四次分手

image.png

视频:https://www.bilibili.com/video/BV1tt4y197Gw

<补充负载均衡------->