网络中的一些概念
- ip地址:用来描述一台主机在互联网中的位置。使用一个32位的整数来表示
- 端口号:区分当前中间上的指定的应用程序(进程),一个主机使用的网络程序有很多个,通过端口号区分当前主机收到的数据是交给那个程序来进行使用的,是一个2个字节的整数(0~65535)。
- 协议:约定的通信双方,交互数据的“规则”。
协议
网络上传输的数据,无论是光信号,电信号和电磁波,他们的本质都是一串二进制的数字,那么主机在网络上进行通信时就要约定好这些二进制传输的到底是什么意思,这个就是“网络通信协议的要完成工作”,由于网络通信是非常复杂的事情,如果使用一个协议,约定网络的所以的通信细节,就会导致这个协议非常的庞大,因此就把这个大的协议拆分成几个小的协议,每个小的协议专注于一类问题,让它们之间相互配合,完成整个网络通信的流程。并且约定好协议之间不能随意相互交互,而是相邻的层之间才可以,上层协议调用下层协议,下层协议给上层协议提供服务。
进行协议分层后带来的好处:降低了使用成本,在使用某个协议时,不需要关心其中的实现细节,降低了整体的耦合性,灵活的变更某个层次的协议
由于OSI七层网络模型在实际的应用中没有被真正的采用,因此这里主要将简化后的TCP/IP5层模型。从上到下依次是:应用层,传输层,网络层,数据链路层和物理层。
其中传输层,网络层和数据链路层是数据转发的过程。传输层主要关注的是数据的起点和终点,并不关心通信的其中的细节,它确保了整个通信过程中的数据完整性和可靠性。网络层是进行网络通信的路径规划,还需要负责地址的管理。此外,网络层还涉及到跨多个网络的数据传输,因此需要解决诸如拥塞控制、分片重组等问题。数据链路层次负责具体的通信过程,比如在同一局域网内的两台主机之间直接传送数据帧。数据链路层提供了节点间的数据传输服务,确保相邻节点之间的可靠通信(尽管在某些情况下也可能只是尽力而为的服务)。它还执行差错检测和纠正、流量控制等功能。在七层模型中,把还有表示层和会话层,不过是它们和应用层融合到TCP/IP 5层协议的应用层中了。
网络设备所在分层:
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
- 对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
- 对于一个交换机,实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
- 对于一个集线器只实现了物理层
注:真实情况下,交换机,也可能是工作在 网络层,甚至是传输层/应用层.
路由器, 也可能是工作在数据链路层,也可能是传输层,也可能是应用层
数据在网络通信中的整体流程
发送方
举个例子,用户A给用户B发送hello这样的信息。
第一步:为了使数据可以通过网络协议栈顺利地被传输,hello这个结构化的数据转化二进制的数据,这个过程被称之为序列化。然后将序列化的数据构造成一个“应用层数据包”,在应用层的网络协议中,就描述了这个数据包的构造,所谓的应用层协议,是开发程序的人员自行定义的。
第二步:应用程序调用操作系统的api,(传输层个应用层提供的api),应用程序把上述组织好的应用层数据包作为参数传进来,于是应用层数据包就到系统内核里,到了传输层代码部分,传输层把应用层的数据进一步封装成一个传输层数据包。传输层有很多协议,最主要的使TCP和UDP(具体情况后文再讲),加成此时使用的是UDP协议,那么此处封装成了UDP报头+UDP正文,UDP包头包含了一些UDP相关的一些信息,例如包含发送者的端口好和接收者的端口号。
第三步:传输层构造好数据之后,就会继续调用 网络层 提供给传输层的 api,把数据进一步交给网络层了,网络层也有多种协议.其中最主要的就是 IPv4 协议.(简称为 IP 协议),IP 协议,就会把上述拿到的 传输层数据包 构造成 网络层数据包,包含IP报头和IP正文,其中IP包头主要包含发送方和接受方的IP地址。
第四步:网络层继续调用数据链路层的 api,把数据交给数据链路层处理,数据链路层的常见协议,以太网(平时插网线, 进行上网的这种方式)。这里对于IP数据包进一步包装,加上以太网数据帧。
第五步:上述得到的数据,需要进一步交给物理层 (硬件设备),网卡就会针对上述的二进制数据,进行真正的传输操作。就需要把上述 0101 这样的序列,转为 光信号/电信号/电磁波,
注:
把结构化的数据转为二进制的字符串,这个过程称之为序列化,把二进制的字符串转化为结构化的数据称之为反序列化。
计算机网络中的封装指的使字符串的拼接。
接收方
第一步:接收方物理层收到光电信号,把这样的光电信号还原成 010101 这样的二进制字符串.
第二步:物理层转换回来的数据, 交给数据链路层,以太网拿到这个数据包,就会对这个数据包进行解析,拿出这里的 报头 和 载荷根据报头中的信息,做一些处理,根据报头信息,决定这个数据包是 丢弃,还是转发,还是自己保留(向上进行解析)
第三步:网络层拿到了上述解析好的数据IP 协议,也要对这个数据包进行解析,取出 IP 报头 和 载荷,也是需要根据报头中的信息确认,丢弃,转发, 保留(给上层协议)
第四步:传输层这边,UDP 协议,也要针对数据进行解析了,取出 UDP 报头和载荷,此处也需要把载荷这里的内容,进一步交给应用层协议,(应用程序)依赖 UDP 报头中的"端口号",端口号就是用来区分不同的进程的。
第五步:应用程序对数据进行反序列化。
TCP和UDP的区别
TCP:有连接,可靠传输,面向字节流,全双工
UDP:无连接,不可靠传输,面向数据报,全双工
有连接/无连接:通信双方,如果保存了通信对端的信息,就相当于是"有连接,如果不保存对端的信息,就是"无连接"。
可靠传输/不可靠传输:此处谈到的"可靠"不是指 100% 能到达对方,而是"尽可能”,相对来说,不可靠,就是完全不考虑,数据是否能够到达对方。
TCP 内置了一些机制,能够保证 可靠传输
1.感知到对方是不是收到了
2.重传机制,在对方没收到的时候进行重试
UDP 则没有可靠性机制!完全不管发出去的数据是否顺利到达对方。
面向字节流/面向数据报:面向字节流数据被视为连续的字节流而不是离散的消息,传输数据的基本单位,不是字节了,而是"UDP 数据报!一次发送/接受,必须发送/接受完整的 UDP 数据报
全双工/半双工:一个通信链路,可以发送数据,也可以接受数据 (双向通信),一个通信链路,只能发送/只能接收(单向通信)