同意主机上的进程能通过多种方式交换信息,那不同主机间的进程呢?甚至不同主机不同平台上的进程该怎样交换信息?因此需要一套通用的网络协议
这里对该网络模型的五个层次做一个简单的介绍
应用层是抽象给应用的,比如对于浏览器HTTP,对于邮件SMTP等,应用不关心下层是如何工作的
应用层工作于用户态而其一下的层次工作于内核态
为应用层提供网络支持
传输层的两个传输协议tcp, udp
特性:
以上特性都是为了保证数据可靠的传输给对方, 不会丢失, 不会失去顺序
udp相对于tcp来说就简单很多, 他只是单纯的发送数据包, 不作其他任何保证, 数据包在下层中丢失, 失序, 都与udp无关,
这样设计的简洁, 使得udp的实时性更加好, 传输效率更高,
在应用层上对udp进行扩充,使其具有tcp的特性
当传输层的数据包超过MSS(tcp最大报文段长度),就要对应用层数据进行分段,这样,当有报文段丢失时,重发的负担更小,
这里的mss应该大概是个什么值呢?应该是网络层数据报最大长度减去其头部长度,
那网络层数据报最大长度(MTU)应该是个什么值呢?这个值通常是约定俗成的,在以太网中,是1500字节。数据报的头部长度是二十个字节
单个主机上有多个进程同时收发数据,用端口号进行区分,有些端口是约定俗成的,例如80web服务器,22ssh服务器,浏览器中的每一个不用的标签页都是一个独立的进程,操作系统为为其分配不同的端口以作区分。
网络层就是个IP协议,ip协议将传输层的报文段进行包装,添加头部信息,如果数据报超过限制,就会进行分片。
上图展示了应用层数据经过的层层包装。
ip协议的关键就是在茫茫互联网中定位两台主机的位置,类似于街道门牌号,我们使用ip地址对主机进行编号
ipv4地址共32位,分成四段,使用点分十进制写法,其实就是四个字节写成十进制,用点分开。
这一串32位数字由两部分组成
那我怎么知道这两部分从哪一位分开?这里就要用到子网掩码,子网掩码用斜杆跟在地址后面
举例:10.100.122.0/24,其中斜杠后的24表示前24位标识子网,后八位在子网中标识主机
严肃讲,这里的子网掩码应该是255.255.255.0,即二进制11111111-11111111-11111111-00000000,前24位都是1,这样计算机就能通过简单的逻辑运算分解ip地址的两部分,24只是一种简写。
实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的。数据包在其中传递时,谁决定了他该怎么走呢?
实际上,路由器储存了ip转发表,根据ip地址的不同,决定数据应该往哪个方向走。
因此ip协议具有了寻址的功能
也有叫网络接口层的,这些术语都是翻译过来的,名称众说纷纭,例如各个层次数据包的称呼,不同的书也不同,因为英文单词的翻译本身就很模糊,链路层(frame),网络层(packet),传输层(segment),应用层(message)
链路层再在数据报上加上mac头部,封装成帧进行传递
在网络层中,ip地址以区分主机,但是在链路层中,用MAC区分各种硬件,你的电脑有有线网接口,又有无线网卡,这些设备的MAC地址都是不一样的,即使他在一台主机上,这个我当时学计网的时候属于是浮光掠影。不很清楚。
再看一下从上到下数据的封装:
其实还有物理层,但是就和软件不搭边了,不做赘述。