1. 简称

  • LAN — 局域网(LocalArea Network)
  • MAN — 城域网(Metropolitan Area Network)
  • WAN — 广域网(Wide Area Network)
  • Internet — 因特网
  • B/S模式 — 浏览器/服务器(Browser/Server)模式
  • C/S模式 — 客户机/服务器(Client/Server)模式
  • Socket — 套接字
  • IP — 网协,网络之间互联的协议(Internet Protocol)
  • TCP/IP 协议 — Internet 网络中采用的协议(Transmission Control Protocol/Internet Protocol)
  • TCP — 传输控制协议(Transmission Control Protocol)
  • UDP — 用户数据报协议(User Datagram Protocol)
  • OSI — 开放式系统互联(Open System Interconnection)
  • IETF — 互联网工程任务组(Internet Engineering Task Force)
  • simplex — 单工通信
  • half-duplex — 半双工通信
  • full-duplex — 全双工通信
  • MSL — TCP报文的在网络上单向传送的最大生存时间(Maximum Segment Lifetime)
  • TTL — IP协议对数据报网络单向传送的时间限制(Time To Live)
  • RTT — 为往返时间(Round Trip Time)
  • URL — 统一资源定位符(Uniform Resource Locator)

2. 基础知识

  1. 背景
    网络编程的目的就是直接或间接地通过网络协议与其他计算机进行通信。
    在 Java 语言中包含网络编程所需要的各种类,编程人员只需要创建这些类的对象,调用相应的方法,就可以进行网络应用程序的编写。

  2. 概念
    计算机网络:是指将有独立功能的多台计算机,通过通信设备线路连接起来,在网络软件的支持下,实现彼此之间资源共享和数据通信的整个系统。
    网络协议:是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。
    单工模式:单工通信只支持信号在一个方向上传输(正向或反向),任何时候不能改变信号的传输方向。为保证正确传送数据信号,接收端要对接收的数据进行校验,若校验出错,则通过监控信道发送请求重发的信号。
    半双工模式:半双工通信允许信号在两个方向上传输,但某一时刻只允许信号在一个信道上单向传输。因此,半双工通信实际上是一种可切换方向的单工通信。
    全双工模式:全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。全双工通信是两个单工通信方式的结合,要求收发双方都有独立的接收和发送能力。(计算机之间的通信是全双工方式
    URL:表示 Internet 上某一资源的地址。

  3. 网络分类
    按照地理范围主要将网络分为局域网、城域网、广域网和因特网。

    • LAN,是一种在小范围内实现的计算机网络,一般在一个建筑物内或者一个工厂、一个事业单位内部独有,范围较小。
    • MAN,一般是一个城市内部组建的计算机信息网络,提供全市的信息服务。
    • WAN,它的范围很广,可以分布在一个省、一个国家或者几个国家。
    • Internet,则是由无数的 LAN 和 WAN 组成的。
  4. 网络编程模型
    在网络通信中主要有两种模式的通信方式:一种是 C/S 模式;另一种是 B/S 模式。

    1. C/S 模式
      Java网络编程 - 图1
      客户机、服务器以及网络三者之间的关系图
      使用 C/S 模式的程序,在开发时需要分别针对客户端和服务器端进行专门开发。
      这种开发模式的优势在于由于客户端是专门开发的,表现力会更强。
      缺点就是通用性差,也就是说一种程序的客户端只能和对应的服务器端进行通信,不能和其他的服务器端进行通信,在实际维护中,也需要维护专门的客户端和服务器端,维护的压力较大。

    2. B/S 模式
      对于很多程序,运行时不需要专门的客户端,而是使用通用的客户端,例如使用浏览器。用户使用浏览器作为客户端的这种模式叫作浏览器/服务器模式。
      使用这种模式开发程序时只需开发服务器端即可,开发的压力较小,不需要维护客户端。但是对浏览器的限制比较大,表现力不强。

  5. 网络协议

    1. IP 协议
      IP:为计算机网络相互连接进行通信而设计的协议。在 Internet 中它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在 Internet 上进行通信时应当遵守的规则。任何厂家生产的计算机系统只有遵守 IP 协议才可以与 Internet 互联。

      • TTL,指定数据包被 路由器丢弃之前允许通过的网段数量。是IP协议包中的一个值,它告诉网络,数据包在网络中的网段是否太长而应被丢弃。TTL 是由发送主机设置的,以防止数据包不断在 IP互联网络上永不终止地循环。转发 IP数据包时,要求路由器至少将 TTL 减小 1。
    2. IP 地址
      问题:对网络编程来说,主要是计算机和计算机之间的通信,首要的问题就是如何找到网络上数以亿计的计算机。<>为了解决这个问题,网络中的每个设备都会有唯一的数字标识,也就是 IP 地址
      IPv4和IPv6

      • 在计算机网络中,现在命名 IP 地址的规定是 IPv4 协议,该协议规定每个 IP 地址由 4 个 0~255 的数字组成。每台接入网络的计算机都拥有一个唯一的 IP 地址,这个地址可能是固定的,也可能是动态的。
      • 网络标识(网络地址)+主机标识(主机地址):A类、B类、C类、D类
        Java网络编程 - 图2

        • 用32位正整数表示
        • 每8位分成一组,共分成四组,每组用 “.” 隔开
        • 再将二进制转换成十进制
      • 目前 IETF设计的用于替代现行版本 IP 协议(IPv4)的下一代协议 IPv6
        Java网络编程 - 图3

        • IPv6地址长128位,能表达的数字高达38位
        • 每16比特为一组,用”:”隔开标记
        • 可用二进制或十六进制的数表示
        • 出现连续0的时候,可以将0省略,并用两个冒号隔开
        • 一个IP地址中只能出现一次两个连续的冒号
    3. TCP/IP 协议
      TCP/IP协议分层模型详解
      Internet 依靠 TCP/IP 协议在全球范围内实现不同硬件结构、不同操作系统、不同网络的互联。
      TCP 负责发现传输的问题,一有问题就发出信号要求重新传输,直到所有数据安全正确地传输到目的地,而 IP 是给 Internet 的每一台电脑规定一个地址。
      TCP/IP 定义了电子设备如何连入 Internet 以及数据如何在它们之间传输的标准。
      TCP/IP协议层次结构图
      Java网络编程 - 图4

    4. TCP 与 UDP 协议
      TCP与UDP详解
      TCP/IP 协议的传输层同时存在 TCP 和 UDP 两个协议。
      Java网络编程 - 图5
      TCP 协议是一种以固定连线为基础的协议,它提供两台计算机之间可靠的数据传送。而 UDP 无连接通信协议,它不保证可靠数据的传输,但能够向若干目标发送数据以及接收来自若干源的数据。
      在网络通信中使用 TCP 的方式需要建立专门的虚拟连接,然后进行可靠的数据连接,如果数据发送失败,客户端会自动重发该数据。而使用 UDP 方式不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。
      在网络通信中 TCP 协议类似于使用手机打电话,可以保证把信息传递给别人;而 UDP 协议类似于发短信,接收人有可能接收不到传递的信息。
      对于一些重要的数据,一般使用 TCP 方式来进行数据传输,而大量的非核心数据则通过 UDP 方式进行传递。
      使用 TCP 方式传递的速度稍微慢一点,而且传输时产生的数据量会比 UDP 大一点。

      1. TCP协议
        首部20字节

        1. 序列号 seq

        2. 确认序列号 ack

        3. 标志:每个标志占1比特,1表示有效,0为无效。

          • URG:紧急指针是否有效。有效会告诉系统此时有紧急数据需要尽快传送。
          • ACK:确认序号是否有效。仅当ACK=1时确认字段才有效。建立连接后,所有的传送的报文都必须把ACK置为1。
          • PSH:接收方应该尽快将这个报文段交给应用层。不必等待缓存区满后再向上交付
          • RST:复位,对方要求重新建立连接。当RST=1代表TCP连接出现严重差错,必须释放连接再重新建立连接。
          • SYN:同步序列号,请求建立连接。在连接请求中,SYN=1 ACK=0表示该数据段是未捎带确认的连接请求报文;SYN=1 ACK=1表示是一个捎带了确认的连接请求报文。
          • FIN:用于释放连接,FIN=1时表示发送方已经没有数据发送了,即关闭本方数据流。
            TCP三次握手
            TCP四次挥手
        4. 其他等等
      2. UDP协议

        1. UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
        2. 一台服务机可同时向多个客户机传输相同的消息
        3. UDP信息报首部只有8个字节,相对于TCP的20个字节信息报而言UDP的额外开销很小。
        4. 它不属于连接型协议,因而具有资源消耗小,处理速度快
  6. 套接字与端口(C/S模式)
    实现网络通信必须将两台计算机连接起来建立一个双向的通信链路,这个双向通信链路的每一端称之为一个套接字(Socket)。

    • 运行在一台特定机器上的某个服务器(如 FTP 服务器)都有一个套接字绑定在该服务器上,服务器只是等待和监听客户的连接请求。客户端客户需要知道服务器的主机名和端口号。

Java网络编程 - 图8

  • 由 Internet 名字和号码指派公司 ICANN 分配绐一些常用的应用层程序固定使用的熟知端口,其值是 0~1023。例如 HTTP 服务一般使用 80 端口,FTP 服务使用 21 端口。
  • 一般端口用来随时分配绐请求通信的客户进程。

此时客户端的套接字并没有绑定到与服务器连接的端口号

3. Java InetAddress 类及其常用方法

  1. Internet 上的主机有两种方式表示地址,分别为域名和 IP 地址。java.net包中的 InetAddress 类对象包含一个主机地址的<b>域名</b>和<b>IP地址</b>。
  2. InetAddress 类提供操作 IP 地址的各种方法。该类本身没有构造方法,而是通过调用相关静态方法获取实例。

4. Java TCP通信:Java ServerSocket 类和 Socket 类

TCP 网络程序是指利用 Socket 编写的通信程序。利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个是服务器程序,一个是客户端程序,两者的功能和编写方法不太一样。
区别:ServerSocket 类表示 Socket 服务器端,Socket 类表示 Socket 客户端
交互:服务器端创建一个 ServerSocket (服务器端套接字),调用 accept() 方法等待客户端来连接。
客户端程序创建一个 Socket,请求与服务器建立连接。
服务器接收客户端的连接请求,同时创建一个新的 Socket 与客户端建立连接,服务器继续等待新的请求。

5. Java UDP通信:Java DatagramSocket类和DatagramPacket类

  1. DatagramPacket 类用来表示数据报包
  2. DatagramSocket 类用于表示发送和接收数据报包的套接字
  1. Java中使用 UDP 协议发送数据的步骤:

    1. 使用 DatagramSocket() 创建一个数据包套接字。
    2. 使用 DatagramPacket() 创建要发送的数据包。
    3. 使用 DatagramSocket 类的 send() 方法发送数据包。
  2. 接收 UDP 数据包的步骤:

    1. 使用 DatagramSocket 创建数据包套接字,并将其绑定到指定的端口。
    2. 使用 DatagramPacket 创建字节数组来接收数据包。
    3. 使用 DatagramPacket 类的 receive() 方法接收 UDP 包。

6. Java 什么是URL?及URL类和URLConnection类

  1. 通过 URL 可以访问各种网络资源,比如常见的 WWW 及 FTP 站点。浏览器可以通过解析给定的 URL 在网络上查找相应的文件或其他资源。
  2. 语法格式:protocol://resourceName,

    • 协议名(protocol)指明获取资源所使用的传输协议,如HTTP、FTP 和 file 等,
    • 资源名(resourceName)则是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。
  3. 关系
    URL类专门用来处理 URL ,可以获得 URL 的相关信息
    URLConnection 类表示与 URL 建立的通信连接
    URLConnection 类的对象使用 URL 类的 openConnection() 方法获得。

7. 面试题

  1. 面试题

    1. 为什么连接的时候是三次握手,关闭的时候却是四次握手?
      TCP是全双工模式的,客户端关闭连接不代表服务端就可以立刻关闭,如果客户端发起关闭的时候,服务端还没有响应完数据给客户端,服务端还是需要把数据发完了再去关闭的,而客户端主动发起了闭关但不会立即关闭,而是进入“FIN_WAIT2”状态进行数据接收,此为半关闭。直到服务端发送完了并最后发送结束连接报文段FIN才进入TIME_WAIT状态。
    2. 为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?
      之所以要等待,是因为关闭方要确认处于“CLOSE_WAIT”状态的被关闭方收到它最后的ACK报文,等待确认报文来回的时间就是2MSL,
      如果被关闭方在2MSL内都没有收到ACK,就会重复发送FIN报文。
      如果关闭方在2MSL时间内未收到被关闭方的报文,则默认收到
      等待原因

      • 保证了最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK)如果直到2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。
      • 2MSL的时间能保证在两个传输方向上的未被接收的数据和迟到的数据全部被丢弃(当连接关闭时,有可能收到迟到的报文段。这时,若立马就建立新的连接【同一端口】,那么新的连接就会接收迟到的报文,误以为是发给自己的)
    3. 为什么不能用两次握手进行连接?
      3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
      假设由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,服务器会一直认为,客户端没有收到消息,会重复发消息,造成资源浪费。 当客户端和服务器通信完成后,这个被浏览器认为失效的消息,到达了服务器,此时,服务器以为是新的连接,然后回应,而浏览器认为没有给服务器发送过消息,所以不会理睬服务器,又造成资源浪费。
      第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判
    4. 如果已经建立了连接,但是客户端突然出现故障了怎么办?
      TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
    5. TCP的特点

      1. 面向连接:
      2. 可靠传输:发送应答机制、超时重传
      3. 错误校验
      4. 滑动窗口
      5. 流量控制
      6. 阻塞管理:慢启动与拥塞避免、快重传和快恢复
    6. UDP特点

      1. 无连接
      2. 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段报文无法送达对方,UDP协议也不会给应用层返回任何错误信息
    7. TCP建立连接不一定必须是三次握手,有时可能会是4次。
      当双发同时进行请求主动打开连接的时候就是4次。此时并没有客户端和服务端之称,双方都有主动发送数据的权利。
      TCP同时建立连接