文章目录
0. OSI网络七层模型
为了使不同计算机厂家的计算机能够相互通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。这个标准就是OSI 网络 七层 模型。
分层的目的,就是让各个层次的人负责,每个人都能专注于自己的负责的领域
1 各层的主要功能
物理层:使原始的数据比特流能在物理介质上传输(电,光等在网线间传递)
数据链路层:通过校验、确认 和 反馈 重发等手段,形成稳定的数据链路。(在这一层中会将数据转化成 010101二进制的形式)(软硬结合的层次)
网络层:进行路由选择和流量控制。(IP协议,可以定位到某一台具体服务器)(逻辑链路) (ping 这种指令都是基于网络层的指令)(网络层是一个逻辑链路,不是真实存在的)
上述三层属于低三层,分层的目的,就是为了语言开发工程师屏蔽底层网络的复杂性。
传输层:提供可靠的端口到端口的数据传输服务(TCP/UDP 协议等待)(承上启下的一个层次)(保证了跨进程,跨机器间的数据传递的准确性)(开发的应用大多数都是基于传输层进行开发的)
会话层:负责建立、管理和终止进程之间的会话和数据交换。
表示层:负责数据格式转换、数据加密与解密、压缩与解压缩等。
应用层:为用户的应用进程提供网络服务。
会话层,表示层,应用层 ,统称为高三层,也有另一种非规范分层,直接将这一层定义为应用层。
http服务器就是典型的高三层的具体体现,实现了高三层的功能,http协议,是基于TCP协议开发的一个应用层协议
这里主要涉及的是一些计算机网络原理方面的知识。
2 传输控制协议TCP
传输控制协议(TCP) 是Internet 一个重要的传输层的协议。TCP提供面向连接、可靠、有序、字节流传输服务。应用程序在使用TCP之前,必须先建立TCP连接。(面向连接,只在数据传递之前,需要建立起连接)
TCP数据报文格式如下:
3 TCP三次握手机制
TCP协议是在IP协议之上的一个端口到端口之间的协议,在数据传输之前,***最大程度***检测网路是否通畅。
客户端首先会向服务端发送数据包,确认服务端是否能够提供正常的服务,服务端会针对客户端的某一次握手请求,进行相应的,然后客户端建立相应的连接(这里的建立连接,指的是提供安全稳定的网络传输的连接),服务端建立连接。
4 TCP四次挥手流程
四次挥手流程(断开连接):
客户端是向服务端请求数据的,而且挥手流程也是由客户端发起的。
客户端会先向服务端发送断开连接的请求,然后服务端响应,并调整为半关闭状态,客户端接收到服务端的响应,处于等待释放的状态,然后服务端再次向客户端发送等待确认,客户端接收到服务端的等待确认后,改变状态处于等待状态,然后再给服务端一个响应,服务端接收到客户端的响应,关闭连接,客户端关闭。
5.UDP协议
UDP协议同样也是传输层协议。提供无连接、不可靠、数据报尽力传输服务。
UDP报文组成:
IP首部 + IP数据部分
IP数据部分 = UDP首部 + UDP数据部分
UDP数据部分 = 源端口号 + 目的端口号 + 发送数据长度 + 校验码 + 应用数据
相对于TCP而言,在UDP协议上构建应用,有哪些优点呢?
1.UDP应用进程更容易控制发送什么数据以及何时发送(TCP协议要建立在三次握手和四次挥手之间才能传输数据)
2.UDP无需连接(TCP需要建立连接)
3.UDP无连接状态 (TCP具有连接状态)
4.UDP首部开销小 (TCP首部开销大)
6.TCP和UDP 比较
TCP | UDP |
---|---|
面向连接 | 无连接 |
提供可靠性保证 | 不可靠 |
慢(相对于UDP) | 快(相对于TCP) |
资源占用多 | 资源占用少 |
TCP协议应用: 需要数据可靠性高的场景。 大部分接口(web – service)(app – service)
UDP协议应用:网络高性能,数据可靠性要求不高的,实时性要求较高的。 比如语音视频等应用的开发。物联网设备日志上报等,对于偶尔丢失一个数据包,影响不大的,就可以使用UDP协议。
7. Socket编程
Internet 中应用最广泛的网络应用编程接口,实现与3种底层协议接口:
数据报类型套接字SOCK_DGRAM (面向UDP接口)
流式套接字SOCK_STREAM (面向TCP接口)
原始套接字SOCK_RAW(面向网络层协议接口IP、ICMP等)
在操作系统底层提供的网络编程接口,无论是什么语言, 只要是需要用到网络,都会调用socket API
主要socket API 及其调用过程
创建套接字 --> 端点绑定 --> 发送数据 --> 接收数据 --> 释放套接字
而Java 中的 socket ,以及 bio / nio 等 api 就是 jdk 帮我们 封装的对底层 socket 操作 的工具
8. SocketAPI函数定义
listen() 、accept() 函数只能用于服务器端;
connect() 函数只能用于客户端;
socket()、 bind() 、 send() 、 recv() 、 sendto() 、 recvfrom() 、close() 通用函数
这些函数是底层操作系统提供的API,这些API 大多都是用C语言去实现,在java中,使用的大多是,jdk已经封装好的,对这些函数的调用。