一、前言
接下来开启网络编程的章节,首先从理解网络编程、了解通信三要素开始。
二、网络编程概述
1.什么是网络编程
可以让设备上的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。也就是让不同设备上的程序,通过网络互相收发数据。
2.通信的基本架构
基本的通信架构有两种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)
-CS架构
Client客户端:需要专门下载安装在电脑/手机上的软件,例如:QQ、微信PC版、网易云音乐等
Server服务端:放在远程服务器,存数据、处理逻辑,一直运行
其一整个工作流程是,你先把软件安装在本地,打开软件主动连接远程服务器,大部分的画面、交互功能都在你本地软件里完成,服务器只负责传数据。
其优点是流畅、功能强、离线还能简单用,缺点是每台设备都要安装、更新,换电脑还得重新下载安装。
-BS架构
Browser浏览器:不用装专门软件,电脑/手机自带浏览器就行,例如:淘宝网页、教务系统等
Server服务端:同CS架构的Server服务端,放在远程服务器,存数据、处理逻辑,一直运行
其一整个工作流程是,不用安装任何软件,打开浏览器输入网址,所有页面、功能全从服务器实时加载,操作请求全部发给后端服务器处理。
其优点是不用安装,打开网页就能用,更新只需要改服务器,所有人同步更新,缺点是断网基本用不了,复杂大功能会有点卡顿。
无论是CS架构,还是BS架构的软件都要依赖网络编程!
三、通信三要素
网络通信的关键三要素:
-IP地址:设备在网络中的地址,是唯一的标识,即设备在网络中的“身份证号码”
-端口:应用程序在设备中唯一的标识,即应用程序在设备中的“身份证号码”
-协议:连接和数据在网络中传输的规则
如何配合实现基本通信:
发送方设备依靠IP地址定位到目标主机,通过端口号精准找到主机上运行的对应程序,再遵循约定好的通信协议规范数据传输格式与交互规则,三者配合完成两台设备指定程序间的数据收发通信。
1.IP地址
IP(Internet Protocol):全称“互联网协议地址”,是分配给上网设备的唯一标志
IP地址有两种形式:IPv4、IPv6
-IPv4:有32位二进制组成,是我们现在常用的网络地址,由四段0-255数字组成(如192.168.1.1),现对于全网设备已经不够用
-IPv6:共128位,号称可以为地球每一粒沙子编号,IPv6是新一代地址协议,用字母+数字分段书写,拥有海量地址,分为八段表示,每段每四位编码成一个十六进制位表示,数之间用冒号隔开(如2001:0db8:0000:0023:0008:0800:200c:417a)
如何查看IP地址
打开命令提示符,输入命令ipconfig回车即可查看IP地址
IP域名:IP是电脑设备在网络里纯数字门牌号,难记且数字枯燥,域名就是给IP起的好记别名(如www.baidu.com),访问网站时会通过DNS域名解析服务器,把输入的域名自动翻译成对应的IP地址,再根据IP找到目标服务器,省去记忆复杂数字地址的麻烦。
公网IP:是可以通过连接互联网的IP地址
内网IP:也叫局域网IP,只能组织机构内部使用
192.168.开头的就是常见的局域网地址,范围即为192.168.0.0—192.168.255.255,专门为组织机构内部使用
特殊IP地址:127.0.0.1、localhost:代表本机IP,只会寻找当前所在的本机
IP常用命令:
-ipconfig:查看本机IP地址
-ping IP地址:检查网络是否连通
ipconfig已经演示过了,接下来演示检查网络是否连通、
InetAddress代表IP地址
InetAddress的常用方法如下
| 名称 | 说明 |
| public static InetAddress getLocalHost() | 获取本机IP,会以一个inetAddress的对象返回 |
| public static InetAddress getByName(String host) | 根据IP地址或者域名,返回一个inetAddress对象 |
| public String getHostName() | 获取IP地址对象对应的主机名 |
| public String getHostAddress() | 获取该IP地址对象中的IP地址信息 |
| public boolean isReachable(int timeout) | 在指定毫秒内,判断主机与该IP对应的主机是否能连通 |
2.端口号
端口:标记正在计算机设备上运行的应用程序的,被规定为一个16位的二进制,范围是0~65535
分类
-周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)
-注册端口:1024~49151,分配给用户进程或某些应用程序
-动态端口:49152~65535,之所以被称为动态端口,是因为它一般不固定分配某种进程,而是动态分配
注意❗:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错!!!
3.协议
通信协议:网络上通信的设备,实现规定的连接规则,以及传输数据的规则被称为网络通信协议
开放式网络互联标准:OSI网络参考模型:全球网络互联标准
TCP/IP网络模型:事实上的国际标准
| OSI网络参考模型 | TCP/IP网络模型 | 各层对应 | 面向操作 |
| 应用层 | 应用层 | HTTP、FTP、SMTP... | 应用程序需要关注的:浏览器,邮箱。 程序员一般在这一层开发 |
| 表示层 | |||
| 会话层 | |||
| 传输层 | 传输层 | UDP、TCP... | 选择使用的TCP,UDP协议 |
| 网络层 | 网络层 | IP... | 封装源和目标IP |
| 数据链路层 | 数据链路层+物理 | 比特流... | 物理设备中传输 |
| 物理层 |
传输层的2个通信协议:
-UDP(User Datagram Protocol):用户数据报协议
-TCP(Transmission Control Protocol):传输控制协议
UDP协议
-特点:无连接、不可靠通信
-通信双方不用提前建立连接,发送方直接把数据包(包括自己的IP、程序端口,目的地IP、程序端口和数据)扔出去,不确定对方有没有收到、不保证顺序、丢包也不会重传。
-简单理解:寄明信片,写好地址直接投递,不知道对方收没收到,信件可能丢失、顺序错乱)
-典型场景:直播、语音通话、游戏联机(可以接受少量丢包,优先保证流畅)
TCP协议
-特点:面向连接、可靠通信
-通信前双方必须先完成三次握手建立专属通道,传输过程会确认数据是否收到、自动重传丢失数据、整理乱序报文,通信结束后通过四次挥手断开连接。
-简单理解:打电话,拨号接通(建立连接),说话互相确认听见,内容不会丢失、顺序不会乱,通话结束挂断
-典型场景:文件下载、网页访问等,要求数据完整不能缺失
TCP协议:三次握手建立可靠连接
-可靠连接:确定通信双方,收发信息都是正常无问题的!(全双工)
-三次握手:
·客户端向服务器端发出连接请求
·服务器端返回一个响应
·客户端再次发出确认信息,连接建立
-为什么三次握手建立连接
假设A(客户端)要打给B(服务器端)
·第一次握手:A:喂,你能听见我说话吗?(A发送请求,证明A具备发送能力)
·第二次握手:B:我听到了,你能听见我的声音吗?(B收到消息,同时反问,证明B能收、也能发)
·第三次握手:A:可以听到(A收到B的回应,证明A能收到B的消息)
如果只有两次握手:A发消息→B回复。此时B单方面认为连接成功,开始持续分配资源等待A传输。假如网络拥堵,A的旧请求延迟抵达服务器,B响应建立连接,但A早就放弃这条请求,不会发送任何数据。服务器白白占用端口、内存资源,造成资源浪费。
TCP协议:四次挥手断开连接
-目的:确保双方数据的收发都已经完成
-四次挥手:
·客户端发出断开连接请求
·服务器端返回一个响应:稍等
·服务器将最后的数据处理完毕后,返回一个响应:确认断开
·客户端发出正式确认断开连接
-简单举例
·第一次挥手:A说,“我说完了,准备挂电话”
·第二次挥手:B回复,“收到你要挂断的请求”
·第三次挥手:B说完所有内容,告知A,“我这边也说完了,可以挂断”
·第四次挥手:A回复,“收到,正式挂断”
为什么是四次挥手而不是三次?
前两次挥手只是确认客户端不再发数据,但服务端可能还有积压数据要传输,不能直接断连;服务端要等自身数据全部发送完毕,才能发出自己的FIN关闭申请,因此必须多一步挥手。
四、总结
以上便是网络编程的基本概念理解,接下来将正式进入网络编程的章节。