一、TCP/IP五层协议
-> 应用层 : 传输的数据在应用程序中如何使用
-> 传输层 : 关注的是通信的起点终点
-> 网络层 : 关注的是通信中的路线规划
-> 数据链路层 : 关注的是相邻节点之间的通信细节
-> 物理层 : 网络通信的基础设施
说是五层,实际上下面这四层都是在 操作系统内核,硬件,驱动程序中已经实现好了,(计算机内置了)
我们程序员在网络编程过程中能影响到的也就只有应用层了.
对于一台主机,他的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
对于一台路由器,他实现了从网络层到物理层,也即是TCP/IP五层模型的下三层; -> 路由器工作在网络层
对于一台交换机,他实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层; -> 交换机工作在数据链路层
对于集线器,他只实现了物理层;
二、封装和分用
封装和分用,是网络传输数据过程中,最核心的流程.
例:
比如说,A通过QQ给B发送了一个hello -> 会经历以下流程
2.1 分装
2.1.1 应用层(应用程序)
QQ从消息输入框获取到用户输入的hello
就要把这个字符串构造成一个应用层的数据包
QQ这样的程序就内置了一个应用层协议,应用层数据包就是按照这个应用层协议约定的格式来构造.
约定格式如下:
接下来,应用程序就会调用操作系统提供的api,把这个数据包交给传输层.
2.1.2 传输层
传输层就会把上述数据作为一个整体,再构造成一个传输层的数据包.
传输层涉及到的协议就是TCP和UDP
此处假定是使用UDP来进行通信.就会构造成一个UDP数据包.
这个数据包,由应用层传输过来的内容看作一个整体,叫做载荷,添加一个UDP报头,叫做报头.
这个整体就是我们的UDP数据包.
形容这样的添加报头的过程就叫做 " 封装 ",其实就是,字符串拼接.
只不过拼接的报头,具有一定的结构.
UDP报头,虽然不能保护数据,但是可以起到 " 贴标签 " 类似效果.
就能承载一些关键的用来转发数据的信息.
对于UDP报头来说,承载的最重要的信息就是 源端口 和 目的端口.
拼好传输层数据包后,就要把这个数据包进一步的交给下层,网络层继续进行了封装.
(交给下层,指的是,下层协议提供一组api(函数),上层调用这个api,并且把刚才构造好的数据通过参数传过去,下层协议就可以来处理这个数据了)
2.1.3 网络层
网络层,这里涉及到了最核心的协议 -> IP协议
网络层 IP协议,把刚才的传输层的UDP数据包作为一个整体,再拼上IP协议的报头.
构造成一个IP数据包.
构造完成完整的IP数据包之后,IP协议继续调用数据链路层的api,把数据再交给数据链路层这里的协议进行处理.
2.1.4 数据链路层
数据链路层这里涉及到的核心协议 -> 以太网 -> 此处 " 以太 " 用来表示网络数据传输的介质.
以太网就是我们日常最常见到的有线网络.
我们日常用到的网线,也叫做 " 以太网线 ",日常用到的网口也叫做 " 以太网口 ".
用到的交换机,也叫做 " 以太交换机 '.
以太数据帧.也是以IP数据包作为一个整体,在这个基础上添加帧头和帧尾.
接下来,再把这个数据交给物理层.
2.1.5 物理层
物理层 -> 硬件设备
把上述这样的以太网数据帧,二进制结构( 一串0 1 0 1 这样的数据),转换成 光信号/电信号/电磁波,然后进行发送.
经过上述一些列的操作,数据就从电脑上发送出去了.
2.2 分用
暂时不考虑中间过程,假定数据包已经到达B网卡了,B如何处理,B的处理过程就称为 " 分用 ".
2.2.1 物理层
B的物理层收到了光信号/电磁波/电信号,就会把这些物理信号转换成 数字信号(二进制的0 1 0 1 ),得到一个以太网数据帧,进一步的把这个数据帧交给数据链路层处理.
2.2.2 数据链路层 以太网
按照以太网数据帧的格式,来解析,取出其中的载荷,再交给上层协议.
2.2.3 网络层 IP协议
按照IP协议的格式进行解析,去除其中的载荷,再交给上层协议.
2.2.4 传输层 UDP协议
按照UDP协议格式来解析,取出其中的载荷,再交给上层协议.
2.2.5 应用层
按照应用程序的内部应用层协议来解析数据
例:
QQ在拿到信息后,就会在窗口中显示,让你看到信息(聊天消息).
分用的过程,就是封装的逆向过程.
真实情况下,两个主机不太会是通过网线直连的,通过一系列的交换机和路由器来进行数据转发的.
但是实际上,即使是经过交换机或者路由器,上述的分装分用过程,也是同样适用的.
只不过,封装分用的程度不一定是到应用层.
经典交换机来说,就只需要封装分用到数据链路层即可.
经典的路由器来说,就只需要封装分用到网络层即可.
交换机会把光电信号转换成以太网数据帧二级制数据,交给数据链路.
交换机的数据链路层就会对上述数据进行解析.
这个解析过程,一方面要取出载荷部分,另一方面,就要解析到帧头中的关键信息.
根据帧头中的关键信息,决定下一步把数据往哪里进行发送,根据这个情况再进一步的构造出新的以太网数据帧.
把这个新的数据通过物理层发送出去.
如果是路由器,情况稍微复杂一点点,就是封装分用到网络层.
先是物理层拿到光电信号,转成二进制数据交给数据链路层
IP协议对进行解析,取出载荷,再重新封装
继续交给数据链路层,继续加上帧头帧尾
这个数据再交给物理层,转成光电信号,继续传输.
三、几个术语
描述一个网络上传输的数据,单位"可能会用到这几个术语:
包 -> packet
段 -> segment
报 -> datagram
帧 -> frame
如 : IP数据包 / IP数据报
网络编程,本质上就是学习 传输层 给 应用层 提供的 API,就可以写入代码,把数据交给传输层,进一步通过层层封装,就可以把数据通过网卡发送出去了.
四、网络编程中一些重要的概念
4.1 客户端VS服务器
再网络中,主动发起通信的这一方,称为 " 客户端 ",被动接受的这一方,称为 " 服务器 ".
同一个程序再不同的场景中,可能是客户端,也可能是服务器.
客户端给服务器发送的数据,称为 " 请求 " (request)
服务器给客户端返回的数据,称为 " 响应 " (response)
客户端和服务器之间的交互,也是有很多种模式的.
1 -> 一问一答
一个请求对应一个响应,一对一 常见于网页开发(web开发)
2 -> 一问多答
一个请求对应多个响应 常见于 "下载"
3 -> 多问一答
多个请求对应一个响应 常见于 "上传"
4 -> 多问多答
一个请求可能对应多个响应
一个响应也可能对应多个请求 常见于 "远程控制/远程桌面"
五、TCP和UDP特点上的差别
要想进行网络编程,需要使用系统的API,本质上是传输层提供的.
传输层涉及到的协议主要是两个,TCP,UDP
由于这两个协议,之间差异很大,他们的api差距也很大.
TCP和UDP特点上的差别:
TCP UDP
有连接 无连接
可靠传输 不可靠传输
面向字节流 面向数据报
全双工 全双工
有链接/无连接 -> 指的是抽象的,本质上就是是否有记录对方的信息
可靠传输/不可靠传输 -> 尽可能的完成数据传输,虽然无法确保数据到达对方,至少可以知道,当前这个数据对方是不是收到了.
ps : 网络上存在的 "异常情况" 是很多的,无论什么手段都无法保证这个数据100%能从A到达B
此处的可靠传输,主要是指发的数据到没到,发送方能知道.
面向字节流 -> 此处谈到的字节流与文件中的字节流完全一致. TCP
网络中传输数据的基本单位是字节.
面向数据包 -> 每次传输的基本单位是一个 "数据报" 特定的结构 UDP
全双工 -> 一个信道,可以双向通信
半双工 -> 一个信道,只能单向通信