这是一个Socket网络编程的专题,将会讲解一些Socket相关的知识(TCP/UDP等),实现一个聊天室功能的项目,讲解Netty的基石NIO相关的知识(Selector、Buffer、Channel等),并会实现一个即时语音通讯系统,还会讲解一些Netty面试的高频考题,比如零拷贝、解决粘包拆包等问题,欢迎持续关注。
另外还有三件重要的事情:
- 个人博客最近上线,已搭建过半(正在持续优化、备案),欢迎访问加友链或者交流心得小轻舟的博客;
- 我司大牛收集了几百本的经典的计算机电子书,我重新分类整理后准备借花献佛送给有需要的同学,假如有需要可以私信我;
- 推荐一个非常用心的Java学习网站:Java SSM仿天猫实战
什么是网络编程
什么是网络
- 在计算机领域,网络是信息传输、接收、共享的虚拟平台;
- 通过它可以实现各个点(你与另外一个人)、面(你的公司与别人的公司)、体(局域网或者QQ)的信息联系在一起,从而实现这些资源的共享;
- 网络也是人类发展史以来最重要的发明,提高了科技科技和人类社会的发展。
什么是局域网
电脑打印机等都连接到一个路由器上面,那么这就称为一个局域网。路由器在通过光纤到达modem,最终连接到外面的广域网(因特网),才能最终实现一个上网的过程
什么是网络编程
为什么会存在网络编程的概念?
假如想传输数据,要将信息体转化为电信号,而转化为电信号就要对数据进行一定的加工处理,每一次相对完整的一个加工的过程,就可以视为一个处理层,这也就引入了七层网络模型、套接字以及数据包。
网络编程从大的方面说就是对信息的发送和接收;
通过操作相应的API调度计算机资源,并利用传输管道(网线)进行数据交换的过程。
七层网络模型
这一部分更为详细的介绍,可以参考如下地址:计算机网络与数据通信
- 应用之间要传输数据(即应用层),就需要调用表示层;
- 表示层:就是把传输的数据表示成数据层面的东西,比如字符串需要被转换成Byte数据,这里发生了一次转换;
- 同时我们进入了会话层:不同机器之间的用户之间建立管理的作用;
- 接收上层的数据,在必要的时候对数据进行分割,并将数据交给网络层并保证数据段的有效性(有效性指的是把数据有效地传输给对面)
- 网络层:控制子网的运行,比如逻辑地址进行分组的传输以及路由的选择;
- 数据链路层:进行物理的地址寻找,同时将原始比特流转化为逻辑传输路线;
- 物理层:电信号或者光信号的传输。
学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。
结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。
1 应用层
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。我们把应用层交互的数据单元称为报文。
域名系统
域名系统(Domain Name System缩写 DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。(百度百科)例如:一个公司的 Web 网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco公司的域名是 www.cisco.com 等。
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。(百度百科)
2 运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议
- 传输控制协议 TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。
- 用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
UDP 的主要特点
- UDP 是无连接的;
- UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
- UDP 是面向报文的;
- UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
- UDP 支持一对一、一对多、多对一和多对多的交互通信;
- UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP 的主要特点
- TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
- 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
- TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
- TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
- 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
3 网络层
在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。
这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。
这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
4 数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
5 物理层
在物理层上所传送的数据单位是比特。 物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
在互联网使用的各种协中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的TCP/IP并不一定单指TCP和IP这两个具体的协议,而往往表示互联网所使用的整个TCP/IP协议族。
总结一下
上面我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下。图片来源:https://blog.csdn.net/yaopeng_2005/article/details/7064869
Socket与TCP、UDP
socket即套接字,在不同的操作系统,Android、Windows或者MAC都有提供套接字Api基础的功能,通过调用socket去使用TCP或者UDP进行对应的数据发送。Socket即是对TCP或者UDP的封装。简单来说就是IP地址与端口的结合协议,一种地址与端口结合的描述协议。是TCP/IP协议的相关API的总称,是网络API的集合实现
我们拿AB两个公司进行收发货为例说明:
1.A欲将货物发送到B公司,A首先需要对货物进行打包(公司层面的约定);
2.包装之后需要对货物进行贴标签(货物部门之间的关系);
3.假使是通过火车运输,这就是物理层;
4.卸载货物,将货物最终运输至具体的客户。
在这个过程中涉及了很多的部门与选择,这也就是各个协议层存在的原因,目的就是各司其职
Socket的作用与组成
1.在网络传输中用于唯一标示两个端点(包括IP+port)之间的连接;
2.主要有四个重要元素:客户端地址、客户端端口、服务端地址、服务端端口;
Socket的传输原理
Socket之TCP与UDP
TCP
- TCP是面向连接的通信协议;
- 通过三次握手建立连接,通讯完成时要拆除连接;
- 由于TCP是面向连接的所以只能用于端到端的通信
UDP
- UDP是面向无连接的通讯方式;
- UDP数据包括目的端口号与源端口号的信息;
- 由于通讯是不需要连接的,所以可以实现广播发送,并不局限于端到端。
Socket编程实战
Socket TCP之客户端实现
下面通过代码实操去构建一个TCP客户端与服务端,客户端发送数据,服务端读取数据并打印数据
报文、协议、Mac地址
报文段
报文段指的是TCP/IP 协议网络传输过程中,起着路由导肮作用。由A进程发送数据到B进程,并不是简单的把字符串转换成Byte数据。整个过程中还需要把Byte数据进行报文解析,然后加上对应的字节头,然后再把字节头信息传递到B程序,B程序当中再把头解析之后得到Buffer数据,应用层把Buffer数据转换成字符串。报文段用以查询各个网络路由网段、IP地址、交换协议等IP数据包。
- 报文段充当整个TCP/IP协议数据包的导航路由功能
- 报文再传输过程中会不断地封装成组、包、帧来传输;
- 封装的方式就是添加一些控制信息组成的首部,即报文头。
传输协议
- 协议 顾名思义就是一种规定、约束;
- 约定大于配置,再网络传输中依然适用;网络的传输流程是健壮的稳定的,得益于基础的协议构成;
- 简单来说就是:A->B的传输数据,B能识别,反之B ->A的传输数据A也能识别,这就是协议。
MAC地址
- Media Access Control或者Medium Access Control;
- 意即为媒体访问控制,或者称为物理地址、硬件地址;
- 用来定义网络设备的位置;
- 形如:44-45-53-00-00,与身份证类似。
IP、端口、远程服务器
IP地址
- 互联网协议地址(英语:Internet Protocol Address,又译为网络协议地址),缩写为IP地址(英语:IP Address);
- 是分配给网络上使用网络协议的设备数字标签;
- 常见的IP地址分为Ipv4与IPv6
- IP地址由32位二进制数组成,常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数;
- IP地址分为A、B、C、D、E五大类,其中E类属于特殊保留地址;
- 如果主机号是1,那么这个地址为直接广播地址。如果使用1.1.1.1发送UDP的话,理论来讲会往整个因特网发送UDP协议 ,但其实它会被对应的局域网的防护墙拦截;
- IP地址为“255.255.255.255”为受限广播地址 。如果使用UDP往这个地址发送消息,局域网的其他设备默认会收到这个广播。
IPv6
- 总共有128位长,IPv6地址的表达形式,一般采用32个16进制数;
- 由两个逻辑部分组成:一个64位的网络前缀和一个64位的主机地址,主机地址通常根据物理地址自动生成,叫做EUI-64位;
- IPv4转换成IPv6一定可行,IPv6转换成IPv4不一定可行。
端口
- 如果把IP地址比作一间房子,端口就是出入这间房子的门或者窗户;
- 在 不同窗户后有不同的人,房子中的用户与外界交流的出口;
- 外界鸽子(信息)飞到不同的窗户也就是给不同的人传递信息;
- 0到1023的端口以及1024到49151端口都是特殊端口;
- 计算机之间依照互联网传输层TCP/IP协议的协议通信,不同的协议对应不同的端口;
- 49152到65535号端口属于“动态端口”范围,没有端口可以被正式地注册占用。
远程服务器
-局域网:一般而言,家里的环境j及公司相互电脑之间的环境都属于局域网;
- 我与你们的电脑之间都属于互联网,而非局域网;
- 默认的我的电脑是无法直接连接到你们的电脑的。因为两者属于各自不同的局域网当中
web请求流程
- 192.168.1.112是局域网地址,110.90.45.6是外网服务器地址;
- 查询域名服务器(通过53端口);
- 访问网页端口号永远都是80;
- 对于HTTPS就是443端口号
展望
下一篇将会讲解一些UDP的知识以及UDP的案例。欢迎持续关注。