OSI七层模型
七层模型一般指开放系统互连参考模型,开放系统互连参考模型 (Open System Interconnect 简称OSI),OSI参考模型是具有7个层次的框架,自底向上的7个层次分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
背景:生活中每个地方都有自己的方言,而大家如果都将方言肯定就乱了,听不懂,为了让大家都能够畅通的交流通信,从而推出普通话标准,大家都用普通话标准,这样就能畅通无阻的通信了。而网络中的节点也是一样,任何网络中的节点只要都遵循这个模型,然后物理上连接起来,它们之间都可以互相通信。
TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。 [1]
TCP/IP协议在一定程度上参考了OSI的体系结构。OSI模型共有七层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在TCP/IP协议中,它们被简化为了四个层次。只有四层体系结构的TCP/IP协议,与有七层体系结构的OSI相比要简单了不少,也正是这样,TCP/IP协议在实际的应用中效率更高,成本更低。
OSI是定义了一个理论的通信模型,而TCP/IP则是实现了这个理论,在这个基础上进行简化的一个通信协议。
OSI七层网络模型 | TCP/IP四层网络模型 | 对应协议 | 对应设备 |
应用层 | 应用层 | HTTP、FTP、SFTP、TELNET、SMTP、WebSocket | 计算机 |
表示层 | |||
会话层 | |||
传输层 | 传输层 | TCP、UDP | 防火墙 |
网络层 | 网络层 | IP、ICMP、OSPF、EIGRP、IGMP | 路由器 |
数据链路层 | 网络接口层 | SLIP、CSLIP、PPP、MTU | 交换机 |
物理层 | ISO2110、IEEE802 | 集线器 |
应用层
应用层:应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的。
(1)对不同种类的应用程序它们会根据自己的需要来使用应用层的不同协议,邮件传输应用使用了SMTP协议、万维网应用使用了HTTP协议、远程登录服务应用使用了有TELNET协议。 [1]
(2)应用层还能加密、解密、格式化数据。 [1]
(3)应用层可以建立或解除与其他节点的联系,这样可以充分节省网络资源。 [1]
HTTP
HTTP_百度百科 (baidu.com)
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网WWW(World Wide Web)的数据通信的基础。
通信过程
详情见TCP/IP通信过程。
报文格式
请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体
WebSocket
WebSocket_百度百科 (baidu.com)
是一个通信协议,WebSocket是一种在单个TCP连接上进行全双工通信的协议。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket 是独立的、创建在 TCP 上的协议。
为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。Websocket 通过HTTP/1.1 协议的101状态码进行握手。
只需要进行一次握手连接,后续就可以通过这个连接一直通信。
与HTTP比较
WebSocket只需要进行一次握手连接,然后就可以进行通信。而HTTP一次握手只能通信一次,每次通信都需要进行握手。
WebSocket只在握手的时候是使用http协议,在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。而HTTP每次都要携带完整的头部,开销比较大。
实时性更强,由于服务端可以监控变化数据主动发送数据给客户端。而HTTP一般只能采用客户端轮询的方式实现,延迟更大。
更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
以下两点暂时没用到过:
可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
传输层
传输层:作为TCP/IP协议的第二层,传输层在整个TCP/IP协议中起到了中流砥柱的作用。且在传输层中,TCP和UDP也同样起到了中流砥柱的作用。
TCP
TCP(传输控制协议)_百度百科 (baidu.com)
https://www.cnblogs.com/jojop/p/14111160.html
传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
TCP是一对一进行通信,广播和多播不适合用TCP
网络层
网络层:网络层在TCP/IP协议中的位于第三层。在TCP/IP协议中网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能。
网络接口层
网络接口层:在TCP/IP协议中,网络接口层位于第四层。由于网络接口层兼并了物理层和数据链路层所以,网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路。
通信过程
TCP/IP协议工作原理和工作流程_tcp工作原理-CSDN博客
https://www.cnblogs.com/jojop/p/14111160.html
1、以web应用为例,在发送数据通信之前先进行三次握手:
①客户端发送SYN包
- 应用层:客户端应用程序(如浏览器)请求建立连接。
- 传输层:TCP 协议创建一个 SYN 数据段。这个数据段的 SYN 标志位被设置为 1,表示这是一个同步序列编号的请求,包含一个初始序列号(例如
seq = x
)。- 网络层:IP 协议将 SYN 数据段封装成 IP 数据包,并添加 IP 头部信息(如源 IP 地址、目标 IP 地址)。
- 链路层:链路层将 IP 数据包封装成数据帧,并添加链路层头部信息(如源 MAC 地址、目标 MAC 地址)。
发送数据:[链路层头部][IP 头部][TCP 头部 (SYN, seq = x)]
②服务端响应SYN-ACK包
- 链路层:服务器的网卡接收到数据帧,并将其传递到网络层。
- 网络层:IP 协议去除 IP 头部,并将 IP 数据包传递到传输层。
- 传输层:TCP 协议识别 SYN 数据段,生成一个 SYN-ACK 数据段。这个数据段的 SYN 和 ACK 标志位被设置为 1,包含服务器的初始序列号(例如
seq = y
)和对客户端序列号的确认号(ack = x + 1
)。- 网络层:IP 协议将 SYN-ACK 数据段封装成 IP 数据包。
- 链路层:链路层将 IP 数据包封装成数据帧。
发送数据:[链路层头部][IP 头部][TCP 头部 (SYN, ACK, seq = y, ack = x + 1)]
③客户端发送ACK包
- 链路层:客户端的网卡接收到数据帧,并将其传递到网络层。
- 网络层:IP 协议去除 IP 头部,并将 IP 数据包传递到传输层。
- 传输层:TCP 协议识别 SYN-ACK 数据段,生成一个 ACK 数据段。这个数据段的 ACK 标志位被设置为 1,包含对服务器序列号的确认号(
ack = y + 1
)。- 网络层:IP 协议将 ACK 数据段封装成 IP 数据包。
- 链路层:链路层将 IP 数据包封装成数据帧。
发送数据:[链路层头部][IP 头部][TCP 头部 (ACK, seq = x + 1, ack = y + 1)]
2、通信
原数据从应用层产生,然后往下经过每一层会根据协议封装数据,到了接收方这边从下往上经过每一层会根据对应的协议对数据进行拆包然后往上传递直到应用层收到原数据。
图上每一层虚线就是在数据封包和解包经过这一层都会遵守一样的协议进行数据的封包和解包,比如HTTP协议,但请求报文经过层层解包到了接收方的的应用层,会根据HTTP请求报文格式:请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体 将数据进行提取,这就是HTTP协议的体现,应用层双方都按这个报文格式进行数据的封装和解包。
这样让人感觉就好像每一层都在直接通信,但实际上每一层不会直接对接通信。
3、四次挥手断开连接
缺陷
像OSl模型一样,TCP/IP模型和协议也有自己的问题。
(1)该模型没有明显地区分服务、接口和协议的概念。因此,对于使用新技术来设计新网络,TCP/IP模型不是一个太好的模板。 [5]
(2)TCP/IP模型完全不是通用的,并且不适合描述除TCP/IP模型之外的任何协议栈。 [5]
(3)链路层并不是通常意义上的一层。它是一个接口,处于网络层和数据链路层之间。接口和层间的区别是很重要的。 [5]
(4)TCP/IP模型不区分物理层和数据链路层。这两层完全不同,物理层必须处理铜缆、光纤和无线通信的传输特征;而数据链路层的工作是确定帧的开始和结束,并且按照所需的可靠程度把帧从一端发送到另一端。 [5]
Socket
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 。
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,套接字主要有目标IP、传输层使用的传输协议、传输层使用的端口号这3个重要参数。
主要类型
1.流套接字(SOCK_STREAM)
流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
2.数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接、不可靠的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
3.原始套接字(SOCK_RAW)
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接 [3]。原始套接字主要用于一些协议的开发,可以进行比较底层的操作。
Java中:java.net.Socket类代表创建TCP连接;java.net.DatagramSocket类代表创建UDP连接
工作流程
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,称之为 Client Socket,另一个运行于服务器端,称之为 Server Socket 。
1.服务器监听:所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态 [3]。
2.客户端请求:所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求 [3]。
3.连接确认:所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求 [3]。
数据物理网络传输
TCP/IP协议 (图解+秒懂+史上最全) - 疯狂创客圈 - 博客园 (cnblogs.com)