网络协议

763 阅读10分钟

OSI网络七层模型

为了使不同计算机厂家的计算机能够相互通讯,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准.这是一套全球都在使用的,目的是为了构建一个最大范围的计算机网络

网络七层模型分别指的是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

每一层的作用都可以作为一个单独的层次,我们可以这么去理解:分层的目的是为了让每一层次的开发设计人员不需要关心整个网络层次.比如说是做硬件的、做网线和光纤的那么只需要知道物理层而不需要关注什么是http.

各层的主要功能

七层模型大致上可以分成三类:低三层、传输层、高三层

低三层

物理层 、数据链路层、网络层这是比较底端的实现我们称之为低三层.目的是为了屏蔽网络底层的复杂性,我们作为一个java开发人员不需要关注太多低三层的

物理层

物理设备之间如何传输数据,比较原始的数据 比如说电信号、光信号怎么在网线或光纤两端之间进行通讯,使原始的数据比特流能在物理介质上传输

数据链路层

实现校验、确认和反馈重发等手段,将物理层不稳定性形成稳定的数据链路.也就是说直接用光纤去传输可能中间丢失一些信号和数据,数据链路层会通过软硬结合的手段去保证我们的数据会稳定的传到另一端,起到保障的作用

网络层

物理层和链路层解决的是两个端之间传输的问题,但是互联网是多个端点的.这么多节点的关系怎么去定位. 比如说发送一个数据到底是发送到哪个机器上面去.这时候网络层就出来了

网络层提供了一个互联网多节点之间传输的逻辑链路,比如说IP协议,通过IP定位到具体的数据目的地.从而达到一个节点任意传输到另一个节点.这个和我们寄快递一样需要一个具体的目的地

传输层

前面说到的网络层是通过IP协议定位到某一个机器但是它没法直接提供一个具体到端口级别的.而传输层提供可靠的端口到端口的数据传输服务(TCP/UDP协议), 它保证了一个跨进程跨机器的一个传输.了解一个传输层相关的协议对开发网络应用是非常有帮助的,因为我们的应用程序大多是基于传输层进行开发的,也就是基于TCP/UDP协议进行开发的

高三层

一般划为会话层、表示层、应用层但是实际工作中它就是一个应用层就好了,因为有一种非规范性的网络模型中就把这三层统一规划成应用层.典型的就是HTTP服务器,比如说我们java的应用程序tomcat或者是c语音的nginx他们都是涵盖了高三层的具体体现

会话层

负责建立、管理和终止进程直接的会话和数据交换,这实际上就是建立连接和关闭连接的过程

表示层

负责数据格式转换、数据加密与解密、压缩与解压等等

应用层

为用户的应用进程提供网络服务

TCP协议

传输控制协议(TCP)是Internet一个重要的传输层协议.TCP提供面向连接、可靠、有序、字节流传输服务.应用程序在使用TCP之前,必须先建立TCP连接.对于TCP协议有两个重点需要了解:三次握手和四次挥手机制.

TCP协议数据报文如图

TCP握手机制

TCP三次握手建立连接它的本质不是要去打通网络关系而是说在发送数据之前检测网络是否通畅,举个例子就好像打电话一样

小王: 喂!听得到吗?

小张: 嗯,听得到啊!

小王:那我准备开始说了,你准备记一下

三次握手也是这个道理,过程如下图所示

请注意图上的建立连接并不是说我们正式的网络通讯连接,而是说在建立正式的网络通讯连接前做的一个准备

第一次握手

客户端首先会发送一个数据包给服务端,然后等待服务端确认

数据包主要内容有SYN(建立连接)和seq(客户端的唯一序号)

第二次握手

服务端收到请求以后**针对seq(唯一序号)响应客户端,**并且带上数据包

数据包主要内容有SYN(建立连接)、seq(服务端的唯一序号)、ack_seq(针对客户端唯一序号响应)

客户端收到服务端的响应后就会认为请求可以建立连接了

第三次握手

客户端建立连接以后会再次告诉服务端我已经做好可以建立连接的准备了你也准备一下

数据包主要内容seq(客户端的唯一序号)、ack_seq(针对客户端唯一序号响应)

服务端和客户端都准备好了以后就可以发送真正的数据了进行通讯了

TCP挥手机制

所谓挥手就是断开连接的过程.无论是客户端还是服务端都不能随随便便断开,这样可能会导致一些数据传输没有结束就被中断连接了,这时候我们的网络就会报错且数据传输不完整了.举个例子就好像挂电话一样

小王:我说完了,你记完了吗?

小张:嗯!我听完了,我检查一遍记完没有,待会再告诉你挂电话

小张:我记完了,现在可以挂电话了!

小王:嗯!你挂吧!

小张:挂电话了...

小王:挂电话了...

第一次挥手

客户端会发送数据包给服务端说我准备结束了

数据包主要内容FIN(关闭连接)和seq(客户端的唯一序号)

第二次挥手

服务端收到客户端的关闭连接请求以后,标记为半关闭状态会响应客户端知道了,你不能再给我发数据了

数据包主要内容seq(服务端的唯一序号)和ack_seq(针对客户端唯一序号响应)

第三次挥手

服务端主动响应客户端你可以关闭了

数据包主要内容FIN(关闭连接)、seq(服务端的唯一序号)、ack_seq(针对客户端唯一序号响应)

第四次挥手

客户端收到服务端的关闭连接的请求以后会再调用一次服务端,我收到你的关闭请求了,你关闭吧

数据包主要内容seq(客户端的唯一序号)、ack_seq(针对服务端的唯一序号请求)

接着服务端收到客户端关闭连接的请求会立马关闭连接

客户端发完以后等一会自动关闭连接

小结

TCP三次握手和四次挥手目的都是为了确保数据可靠传输做的保障措施.只有在开始通讯前或者是结束通讯前反复确认才能确保此次数据传输的可靠性.

UDP协议

用户数据报协议UDP是Internet传输层协议.提供无连接、不可靠、数据报尽力传输服务

UDP数据报协议如图

看到UDP的协议很精简.没有连接的状态也没有数据标志位,只有最简单的起始地、目的地、应用数据、应用数据的长度和校验码

只是把应用数据传到目的地的信息往网络上一丢就交给网络设备交给路由器让它们去传输了,就好像飞鸽传书一样到底数据传输成功不成功自己都不知道

开发人员在使用UDP协议的时候,关注以下几点

1.应用程序更容易控制发送什么数据以及何时发送

2.无需建立连接

3.无连接状态

4.首部开销小

TCP和UDP比较

这两个协议进行比较会显得非常鲜明.TCP做的事情比较多所以效率比较慢可靠性比较高.UDP做的事情比较少所以效率比较快但也不能保证可靠性

协议 连接 可靠性 速度 资源占用
TCP 面向连接 提供可靠性保证 资源占用多
UDP 无连接 不可靠 资源占用少

这里面的速度快慢指的只是TCP和UDP连接相比而言,实际上对于应用开发而言大多数都是基于TCP协议之上进行的封装这个速度还是很快的,毕竟大多数应用是要保证数据可靠性的

但是也有一些场景会用到UDP协议.对网络性能要求高但是对于数据可靠性要求不高的场景下用UDP比较合适

比如说

音视频: 一般不会关心之前发生了什么只关心现在发生了什么,讲究一个实时性,偶尔的丢包导致视频通话卡顿或模糊也是可以接受的

智慧城市: 路灯上有芯片,每隔一分钟上传一次路灯的通电状态.每分钟都会上传,丢几个包也是可以接受的

Socket编程

Internet中最广泛的网络应用编程接口,这种编程接口在操作系统底层就已经帮我们提供了也就是说在操作系统上运行的软件用的都是统一的Socket编程接口

如下图:不管是什么样的语言想要进行网络连接,它都会遵循这样的过程

1.创建套接字 = 也就是Socket

2.绑定端口 = 不管是服务端还是客户端都会有绑定端口这个过程

3.发送数据

4.接收数据

5.断开连接

这种编程接口实现了与3种底层协议接口

1.数据报类型套接字SOCK_DGRAM (面向UDP接口)

2.流式套接字SOCK_STREAM (面向TCP接口)

3.原始套接字SOCK_RAW (面向网络层协议接口IP/ICMP等)

Socket API 函数定义

listen()、accept()函数只能用于服务器端

connect()函数只能用于客户端

socket()、bind()、send()、recv()、sendto()、recvfrom()、close() 函数通用

这些API是很底层的,比如说C语言在使用的时候会用到这些API

但是java却略有不同,很多工序和函数调用已经被封装成了一个方法或者说是少数方法