网络编程

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地址用于定位节点或计算机。

  1. // InetAddress
  2. // 封装计算机的ip地址 没有端口
  3. // 本地主机地址
  4. InetAddress address = InetAddress.getLocalHost();
  5. // 返回文本表示中的IP地址字符串。
  6. System.out.println(address.getHostAddress());
  7. // 获取此IP地址的主机名。
  8. System.out.println(address.getHostName());
  9. // 通过域名获取
  10. InetAddress baiduAddress = InetAddress.getByName("www.baidu.com");
  11. System.out.println(baiduAddress.getHostAddress()); // 14.215.177.39
  12. System.out.println(baiduAddress.getHostName()); // www.baidu.com
  13. // 通过ip获取
  14. InetAddress ba = InetAddress.getByName("103.41.167.234"); // zhihu ip
  15. System.out.println(ba.getHostAddress());
  16. System.out.println(ba.getHostName());
  17. // 输出ip而不是域名
  18. // 如果这个ip地址不存在或DNS服务器不允许记性IP地址和域名的映射
  19. // 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
  1. netstat -ano 查看所有端口
  2. netstat -ano|findstr "808" 查看指定端口
  3. tasklist|findstr "808" 查看指定进程
  4. 查看具体进程 使用任务管理器查看PID
  1. // 域名或地址
  2. InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 80);
  3. InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 9000);
  4. System.out.println(inetSocketAddress.getAddress());
  5. System.out.println(inetSocketAddress.getHostName());
  6. System.out.println(inetSocketAddress.getPort());
  7. // /127.0.0.1
  8. // 127.0.0.1
  9. // 80

URL

在www上,每一个信息资源都有统一且唯一的地址,即统一资源定位符Unifrom Resource Locator(URL)。如http://www.baidu.com:80/index.html,有四部分组成:

  1. 协议
  2. 域名/主机名/ip地址
  3. 端口
  4. 资源文件名

URI:Universal Resource Identifier,统一资源标识符,用于标识抽象或物理资源的一个紧凑字符串。

URL:Universal Resource Locator统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准你的url必须包括:protocol host prot path parameter anchor

URN:Universal Resource name 统一资源名称,通过特定命名空间中的唯一名称或id表示资源。比如种子。

  1. URL url = new URL("http://www.baidu.com:80/index.html?cansu=xx#aa");
  2. System.out.println(url.getProtocol());
  3. System.out.println(url.getHost());
  4. System.out.println(url.getPort());
  5. System.out.println(url.getDefaultPort());
  6. // uri
  7. System.out.println(url.getFile());
  8. System.out.println(url.getPath());
  9. // 锚点
  10. System.out.println(url.getRef());
  11. // 参数
  12. System.out.println(url.getQuery());
  13. System.out.println(url.toString());
  14. // http
  15. // www.baidu.com
  16. // 80
  17. // 80
  18. // /index.html?cansu=xx
  19. // /index.html
  20. // aa
  21. // cansu=xx
  22. // http://www.baidu.com:80/index.html?cansu=xx#aa
  23. URL url = new URL("https://www.jd.com");
  24. InputStream is = url.openStream();
  25. BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
  26. String msg = null;
  27. while(null != (msg = br.readLine())){
  28. System.out.println(msg);
  29. }
  30. br.close();

传输协议

TCP

TCP(transfer control potocol)一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。

  • 面向连接
  • 点到点的通信
  • 高可靠性
  • 占用系统资源多、效率低
  • 数据大小无限制

TCP应用

  1. HTTP
  2. FTP
  3. SMTP

三次握手

  • 点名
  • 答道
  • 确认
  1. 发送方发送数据给接受方
  2. 接受方接收到发送方发送的数据并回复
  3. 发送方接收到接收方发送的数据

四次挥手

UDP

UDP(User DatagramProtocol)一种无连接的传输层协议,面向事务的简单不可靠信息传送服务。

  • 非面向连接,传输不可靠,可能丢失
  • 发送不管对方是否准备好,接收方也不确认
  • 可以广播发送
  • 非常简单的协议,开销小

UDP应用

  1. DNS(domain name system)
  2. SNMP

socket套接字

我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层和传输层之间,则是使用套接字来进行分离。

套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其他层次的工作。

基于TCP协议的Socket编程

通信双方需要建立连接,连接建立时双方存在主次之分。

基于UDP协议的Socket编程

通信双方不需要建立连接,通信双方完全平等。

UDP网络编程

  • 不需要利用IO流实现数据的传输
  • 每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找他的目的地,一般来说数据包是有大小限制的,不超过60k。

UDP基本概念
  • DatagramSocket:用于发送或接受数据包的套接字
  • DatagramPacket:数据包

TCP编程

  • TCP协议基于请求-响应模式
  • 第一次主动发起通讯的程序被称作客户端(Client)程序
  • 第一次通讯中等待连接的程序被称为服务器(Server)端