Python微信订餐小程序课程视频
https://edu.youkuaiyun.com/course/detail/36074
Python实战量化交易理财系统
https://edu.youkuaiyun.com/course/detail/35475
大家好,我是大明哥,一个专注于【死磕 Java】系列创作的程序员。
【死磕 Java 】系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码。
死磕 Java :https://www.cmsblogs.com/group/1420041599311810560
前两篇文章我们分析了 Channel 及 FileChannel,这篇文章我们探究 SocketChannel的核心原理,毕竟下一个系列就是 **【死磕 Netty】**了。
聊聊Socket
要想掌握 SocketChannel,我们就必须先了解什么是 Socket。要想解释清楚 Socket,就需要了解下 TCP/IP。
注:本文重点在 SocketChannel,所以对 TCP和 Socket仅仅只做相关介绍,有兴趣的同学,麻烦自查专业资料。
TCP/IP 体系结构
学过计算机网络的小伙伴知道,计算机网络是分层的,每层专注于一类事情。OSI 网路模型分为七层,如下:
OSI 模型是理论中的模型,在实际应用中我们使用的是 TCP/IP 四层模型,它对OSI模型重新进行了划分和规整,如下:
网络层次划分清楚了,那怎么传输数据呢?如下图:
计算机A首先在应用层将要发送的数据准备好,然后给传输层, 传输层的主要作用就是为发送端和接收端提供可靠的连接服务,传输层将数据处理完成后给网络层, 网络层的一个核心功能就是数据传输路径的选择。计算机A到计算机B有很多条路,网络层的作用就是负责管理下一步数据应该到那个路由器,选择好路径后,数据就到了网络接入层,该层主要负责将数据从一个路由器发送到另一个路由器。
上图是一个非常清晰的传输过程。但是我们思考两个个问题:
- 计算机A是怎么知道计算机B的具体位置的呢?
- 它又怎么知道将该数据包发送给哪个应用程序呢?
TCP/IP协议族已经帮我们解决了这个问题: IP地址+协议+端口。
- 网络层的“IP地址”唯一标识了网络中的主机:这样就可以找到要将数据发送给哪台主机了。
- 传输层的“协议 + 端口”唯一标识主机中的应用程序:这样就可以找到要将数据发给那个应该程序了。
利用三元组(IP地址、协议、端口)就可以让计算机A确定将数据包发送给计算机B的应用程序了。
使用TCP/IP 协议的应用程序通常采用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言, 几乎所有的应用程序都是采用的 Socket。
Socket
上面提到就目前而言,几乎所有的应用程序都是采用 Socket 来完成网络通信的。那什么是Socket呢?百度百科是这样定义的:
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
在TCP/IP四层模型中,我们并没有看到 Socket 影子,那它到底在哪里呢? 又扮演什么角色呢?
Socket 并不是属于 TCP/IP 模型中的任何一层,它的存在只是为了让应用层能够更加简便地将数据传输给传输层,应用层不需要关注TCP/IP 协议的复杂内容。我们可以将其理解成一个接口,一个把复杂的TCP/IP协议族隐藏起来的接口,对于应用层而言,他们只需要简单地调用 Socket 接口就可以实现复杂的TCP/IP 协议,就像设计模式中的门面模式( 将复杂的TCP\IP 协议族隐藏起来,对外提供统一的接口,是应用层能够更加容易地使用)。简单地说就是简单来说可以把 Socket理解成是应用层与TCP/IP协议族通信的抽象层、函数库。