网络初识 二

一、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

全双工   ->   一个信道,可以双向通信

半双工   ->   一个信道,只能单向通信

  • 52
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值