网络编程
IP地址
IP用于定位不同的电脑,每天电脑的IP地址唯一,相当于地址。
端口
端口用于区分电脑中的软件,每个软件的端口都不一样,相当于门牌号。
URL
URL全称统一资源定位符,通过IP地址与端口号以及URL可实现资源共享。
协议
协议用于约束或规范某一行为。
传输层
TCP协议
相当于打电话,建立连接,通信,安全,面向连接
UDP协议
相当于写信,只需要负责写好,不安全,高效
基本概念
网络的概念
传输介质
网络的划分
根据地域划分
根据地域划分可分为局域网、城域网、广域网。从而使计算机实现信息传输、资源共享
通讯协议
数率、传输代码、代码结构、传输步骤、出错控制等。
通信接口
使两个节点之间能够对话,需要在它们之间建立通信,彼此之间进行信息交换。接口包括硬件接口、软件接口。
- 硬件装置:实现节点之间的信息传输
- 软件装置:规定双方进行通信的约定协议
网络的分层
由于节点之间联系很复杂,在指定协议时,把复杂成分分解成一些简单的成分,再将他们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。
应用层
表示层
回话层
传输层
网络层
数据链路层
物理层
TCP/IP
是一个协议族,也是按照层次划分,共四层:应用层、传输层、互联网层、网络接口层(物理+数据链路层)。
TCP(transfer control protocol)
ip(Internet protocol)
OSI网络通信协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI模型,但是并没有严格按照OSI规定的七层标准去划分,而只是划分了四层,这样会更简单,当划分太多层次时,很难区分某个协议时属于哪个层次的。
数据封装
Data Encapsulation是指将协议数据单元(PDU)封装在一组协议头和协议尾中的过程。在OSI七层参考模型中,每层主要负责与其他机器上的对等层进行通信。该过程是在协议数据单元中实现的,其中每层的PDU一般由本层的协议头、协议尾和数据封装构成。
由于用户传输的数据一般都比较大,有的可以达到MB字节,一次性发送出去十分困难,于是就需要将数据分成许多片段,再按照一定的次序发送出去。这个过程就需要对数据进行封装。
- 应用层:准备数据
- 传输层:接受应用层数据添加上TCP的控制信息(称为TCP头部),这个数据单元称为段(segment),加入控制信息的过程称为封装。由此,将段交给网络层。
- 网络层:接受到段,再添加上TCP头部,这个数据单元称为包(package)。然后,将包交给数据链路层。
- 数据链路层:将包再添加上MAC头部和尾部,这个数据单元称为帧(frame)。然后,将帧交给物理层。
- 物理层:将接收到的数据转化为比特流,然后在网线中传送。
发送数据由高层到底层,每层对数据记性封装交给下层。
数据拆封
Data dismantling是指将接受到的数据进行拆包,每一层只把对改成有意义的数据拿走,或者说每一层只能处理发送方等层的数据,然后把其余的部分传递给上一层,这就是对等层通信的概念。
- 物理层:接收到比特流,经过处理后将数据交给数据链路层。
- 数据链路层:将接受到的数据转换为数据帧,再除去MAC头部和尾部,这个除去控制信息的过程称为解包,然后将包交给网络层。
- 网络层:接收到包,再除去IP头部,然后将段交给传输层。
- 应用层:处理数据。
接受方数据处理的方式是由底层到高层,每层对数据进行拆封。
资源定位
ip地址
ip地址用来标记网络中一个实体通信的地址(节点的地址)。通信实体可以是计算机、路由器等。、
ip地址的分类
IPV4:32位地址,以点分十进制表示,如192.168。0.1
ipv6:128位(16个字节)写成8个16位的无符号整数,每个整数用4个十六进制表示,数之间用冒号(:)分开,如:fe80::7841:b5b9:ad09:ef76%3
特殊的ip地址
127.0.0.1 本机地址
192.168.0.0-192.168.255.255私有地址,属于非注册地址,专门为政府或机构内部使用。
ip地址用于定位节点或计算机。
// InetAddress
// 封装计算机的ip地址 没有端口
// 本地主机地址
InetAddress address = InetAddress.getLocalHost();
// 返回文本表示中的IP地址字符串。
System.out.println(address.getHostAddress());
// 获取此IP地址的主机名。
System.out.println(address.getHostName());
// 通过域名获取
InetAddress baiduAddress = InetAddress.getByName("www.baidu.com");
System.out.println(baiduAddress.getHostAddress()); // 14.215.177.39
System.out.println(baiduAddress.getHostName()); // www.baidu.com
// 通过ip获取
InetAddress ba = InetAddress.getByName("103.41.167.234"); // zhihu ip
System.out.println(ba.getHostAddress());
System.out.println(ba.getHostName());
// 输出ip而不是域名
// 如果这个ip地址不存在或DNS服务器不允许记性IP地址和域名的映射
// getHostName方法就直接返回这个ip地址
getByName
通过ip或域名获取ip地址,getLocalHost
返回本机ip。
getHostAddress
返回主机ip地址,getHostName
返回计算机名。
端口
通过ip地址可以定位到计算机,但一台计算机不止有一个网络应用程序,端口正是用来区分计算机上的网络应用程序的。
端口是虚拟的概念,通过端口,可以在主机上运行多个网络应用程序。端口表示一个16位的二进制整数,2个字节,对应十进制的0-65535。
- 公认端口:0-1023,比如80端口分给http,21端口分配给FTP
- 注册端口:1024-49151,分配给用户进程或应用程序
- 动态/私有端口:49152-65535
netstat -ano 查看所有端口
netstat -ano|findstr "808" 查看指定端口
tasklist|findstr "808" 查看指定进程
查看具体进程 使用任务管理器查看PID
// 域名或地址
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 80);
InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 9000);
System.out.println(inetSocketAddress.getAddress());
System.out.println(inetSocketAddress.getHostName());
System.out.println(inetSocketAddress.getPort());
// /127.0.0.1
// 127.0.0.1
// 80
URL
在www上,每一个信息资源都有统一且唯一的地址,即统一资源定位符Unifrom Resource Locator(URL)。如http://www.baidu.com:80/index.html
,有四部分组成:
- 协议
- 域名/主机名/ip地址
- 端口
- 资源文件名
URI:Universal Resource Identifier,统一资源标识符,用于标识抽象或物理资源的一个紧凑字符串。
URL:Universal Resource Locator统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准你的url必须包括:protocol host prot path parameter anchor
URN:Universal Resource name 统一资源名称,通过特定命名空间中的唯一名称或id表示资源。比如种子。
URL url = new URL("http://www.baidu.com:80/index.html?cansu=xx#aa");
System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getDefaultPort());
// uri
System.out.println(url.getFile());
System.out.println(url.getPath());
// 锚点
System.out.println(url.getRef());
// 参数
System.out.println(url.getQuery());
System.out.println(url.toString());
// http
// www.baidu.com
// 80
// 80
// /index.html?cansu=xx
// /index.html
// aa
// cansu=xx
// http://www.baidu.com:80/index.html?cansu=xx#aa
URL url = new URL("https://www.jd.com");
InputStream is = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String msg = null;
while(null != (msg = br.readLine())){
System.out.println(msg);
}
br.close();
传输协议
TCP
TCP(transfer control potocol)一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
- 面向连接
- 点到点的通信
- 高可靠性
- 占用系统资源多、效率低
- 数据大小无限制
TCP应用
- HTTP
- FTP
- SMTP
三次握手
- 点名
- 答道
- 确认
- 发送方发送数据给接受方
- 接受方接收到发送方发送的数据并回复
- 发送方接收到接收方发送的数据
四次挥手
UDP
UDP(User DatagramProtocol)一种无连接的传输层协议,面向事务的简单不可靠信息传送服务。
- 非面向连接,传输不可靠,可能丢失
- 发送不管对方是否准备好,接收方也不确认
- 可以广播发送
- 非常简单的协议,开销小
UDP应用
- DNS(domain name system)
- SNMP
socket套接字
我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层和传输层之间,则是使用套接字来进行分离。
套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其他层次的工作。
基于TCP协议的Socket编程
通信双方需要建立连接,连接建立时双方存在主次之分。
基于UDP协议的Socket编程
通信双方不需要建立连接,通信双方完全平等。
UDP网络编程
- 不需要利用IO流实现数据的传输
- 每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找他的目的地,一般来说数据包是有大小限制的,不超过60k。
UDP基本概念
- DatagramSocket:用于发送或接受数据包的套接字
- DatagramPacket:数据包
TCP编程
- TCP协议基于请求-响应模式
- 第一次主动发起通讯的程序被称作客户端(Client)程序
- 第一次通讯中等待连接的程序被称为服务器(Server)端