Java网络编程(一)网络基础[通信协议HTTP|WebSocket|TCP/IP|UDP]

概述

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递

网络分类

  • 局域网(LAN)
    • 局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围通常局限在10千米范围之内,属于一个公司或部门组建的小范围区域
  • 城域网(MAN)
    • 城域网是作用范围在广域网与局域网之间的网络,其网络覆盖范围通常可以延伸到整个城市,借助通信光纤将多个局域网联通公用城市网络形成大型网络,使得不仅局域网内的资源可以共享,局域网之间的资源也可以共享
  • 广域网(WAN)
    • 广城网是一种远程网,涉及长距离的通信,覆盖范围可以是多个国家甚至整个世界。由于广域网地理上的距离过于长,所以信息衰减非常严重,这种网络一般要租用专线,通过接口信息处理协议和线路连接起来,构成网状结构,解决寻径问题

网络通信协议

计算机网络中实现通信必须有一些约定,即通信协议。包括对速率、传输代码、代码结构、传输控制步骤、出错控制等制定的标准。常见的网络通信协议有:TCP/IP协议、IPX/SPX协议等。为了使两个节点之间能进行对话,必须在他们之间建立通信工具(即端口port),使彼此之间能进行信息交换。

TCP/IP协议:传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

  • 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
  • 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
  • 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
  • 数据链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动

HTTP

概述

HTTP(Hyper Text Transformer Protocol,即超文本传输协议)是一种通信协议,是基于TCP/IP通讯协议之上用来传输HTML和图片文件的应用协议,主要目的就是通过HTTP协议定义了客户端(Browser)与服务器之间的通信规范,以实现对各种资源(如 HTML 页面、图像、音频、视频等)的传输和访问;

  • HTTP协议特点
    • 基于请求响应模式
      • HTTP协议采用客户端-服务器架构模式,客户端向服务器发送请求,服务器返回相应的响应。这种模式可以有效分离应用逻辑,提高系统的可维护性和扩展性
    • 无连接
      • HTTP协议是一个无连接协议,每个请求都是独立的,服务器处理请求后立即关闭连接。这样可以节省资源,但也带来了一些缺点,如需要重新建立连接、重复发送相同的头部信息等
    • 传输效率|可靠性高
      • 无状态:数据传输过程中,不保存任何历史和状态信息
      • 采用TCP作为传输层协议
    • 支持多媒体传输
      • HTTP协议可传输多种类型的数据,如HTML、XML、JSON、图片、音频、视频等。这使得 HTTP协议成为一种通用的网络传输协议,适用于各种不同类型的应用场景
    • 兼容性好
      • 支持B/S、C/S模式
  • HTTP协议不足
    • HTTP协议是明文传输的,容易被窃听、篡改或者伪造
    • 在请求/响应模型中,每个请求都需要建立一个新的TCP连接,增加了网络通信的开销
    • HTTP协议只能进行简单的身份认证,如基本认证和摘要认证等。这种认证方式容易受到攻击,无法提供足够的安全保障

HTTP请求响应流程

HTTP 协议的请求响应流程

HTTP报文

请求报文

 一个HTTP请求的消息包括:请求行、请求头部、空行、请求数据四个部分组成

请求头

响应报文

 响应的消息也由四个部分组成:状态行、消息报头、空行、响应正文

响应头

HTTP版本

HTTP1.0

HTTP/1.0是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛用于在代理服务器中。服务器不跟踪每个客户端也不记录过去的请求(无状态),这种无状态性可以借助cookie/session机制来做身份认证和状态记录,同时它默认采用短连接,即HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接)

缺陷如下

  • 无连接:无法复用连接,每次请求必须重新创建TCP连接,增加了网络通信的开销
  • 队头阻塞:1.0规定下一个请求必须在前一个请求响应到达之后才能发送,否则必须处于等待状态
HTTP1.1
  • 长连接:HTTP1.1增加了一个Connection字段,通过设置Keep-Alive可以保持HTTP连接不断开,避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection: false来告知服务器关闭请求
  • 支持请求管道化(pipelining):基于HTTP1.1的长连接,使得请求管线化成为可能。即在同一个TCP连接上可以同时发送多个请求而不需要等待前面的响应返回,从而进一步提高了网络传输效率
HTTP2.0
  • 多路复用:允许同时通过单一的HTTP/2连接发起多重的请求-响应消息
  • 二进制分帧:HTTP/2在应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。在不改动 HTTP/1.x 的语义、方法、状态码、URI以及首部字段的情况下, 解决了HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量

HTTP状态码(常见的)

  • 200 OK
  • 302 Found 表示临时重定向,而不是永久重定向
  • 401 Unauthorized 表示当前请求需要用户验证
  • 403 Forbidden 表示服务器已经理解请求,但是拒绝执行它
  • 404 Not Found 表示请求失败,请求所希望得到的资源未被在服务器上发现

  • 500 Internal Server Error 表示无法完成对请求的处理,一般是服务器端内部错误

HTTP协议的安全性

HTTP协议是明文传输的,即所有的请求和响应都是以明文形式传输的。这意味着在传输过程中可能会被窃听、篡改或者伪造。为了解决HTTP协议的安全问题,HTTPS协议应运而生。HTTPS协议是在HTTP协议的基础上添加了SSL/TLS协议,通过数字证书(加密和认证技术,包括对称加解密、非对称加解密、数字签名等)来保证数据的安全性。使用HTTPS协议时,客户端和服务器之间的所有通信都是经过加密的,第三方无法窃听或篡改。此外HTTPS还支持证书认证,可以验证服务器的身份,防止伪造和中间人攻击

HTTPS保证数据传输安全的验证流程

WebSocket

概念

WebSocket协议是一种依赖HTTP协议、基于TCP协议的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,即在客户端给服务端发送信息的同时也允许服务器主动发送信息给客户端,

特点如下

  • 实时通信协议,允许双向通信
  • 建立在HTTP协议之上,通过握手协议来建立持久化连接
  • 使用二进制协议传输数据,速度更快。
  • 支持跨域通信。
  • 支持服务器推送数据

WebSocket协议产生原因

WebSocket协议产生之前,都是通过HTTP轮询(轮询技术一般在浏览器上就是使用 setInerval或setTimeout)来实现客户端和用户端之间双工通讯,即客户端向主机不断发送不同的HTTP请求来进行询问,所以浪费带宽资源(毕竟HTTP最初的目的也不是为了双向通讯)。而且发送HTTP请求只能由客户端发起而不能由服务端向客户端发起请求。为了能实现客户端和服务端的双向通信,经过多年发展于是WebSocket协议在2008年就诞生了

工作原理

基于HTTP协议和WebSocket协议客户端和服务器工作流程

WebSocket的工作原理可以分为三个阶段:握手、数据传输和断开连接

  • 握手
    • 客户端发起WebSocket连接时,WebSocket协议复用了 HTTP 的握手请求过程,通过向服务器发送一个特殊的HTTP请求头来建立连接。服务器检查请求头中的特定字段来确认支持WebSocket协议后,发送特殊的HTTP响应头进行握手确认。握手成功后,双方建立了WebSocket连接,可以进行后续的数据传输
  • 数据传输
    • 成功建立WebSocket连接后,客户端和服务器可以通过该连接进行双向的实时数据传输。双方可以发送和接收消息,消息以帧的形式进行传输。WebSocket协议定义了不同类型的帧,如文本帧和二进制帧,用于传输不同类型的数据
  • 断开连接
    • 当不需要进行连接时,客户端或服务器可以发起关闭连接的请求。双方会交换特殊的关闭帧以协商关闭连接,并确保双方都接收到了关闭请求

WebSocket应用

WebSocket API(前端示例)
  • WebSocket API就是一个使用WebSocket协议的接口,通过它来建立全双工通道来收发消息,在客户端和服务端一开始握手的期间,http协议升级到WebSocket协议就建立了连接,底层都是TCP协议。一旦建立连接,通过WebSocket接口可以反复的发送消息
  • WebSocket API是纯事件驱动,一旦建立全双工连接,当服务端给客户端发送数据或者资源,它能自动发送状态改变的数据和通知
  • 常用的WebSocket事件:onopen、onmessage、onclose等
  • 常用的WebSocket 方法:send()和close()
  • WebSocket属性:readyState(open、connecting、closing、closed)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Websocket</title>
</head>
<body>
<script>
    var socket;
    if (window.WebSocket) {
        socket = new WebSocket("ws://localhost:9999/hello");
        //相当于channelRead0,读取服务器端的消息
        socket.onmessage = function(ev){
            var rt = document.getElementById("responseText");
            rt.value = rt.value + "\n" + ev.data;
        }
        //开启连接
        socket.onopen = function(ev){
            var rt = document.getElementById("responseText");
            rt.value = "开启连接成功!";
        }
        //连接关闭
        socket.onclose = function(ev){
            var rt = document.getElementById("responseText");
            rt.value = rt.value + "\n" + "连接关闭成功!";
        }
    }
    //发送消息给服务器
    function send(msg){
        if(!window.socket){ //是否已创建socket
            return;
        }
        if(socket.readyState == WebSocket.OPEN){
            socket.send(msg);
        }else{
            alert("socket未连接");
        }
    }
</script>
<form onsubmit="return false">
    <textarea name="message" style="height:300px;width:300px"></textarea>
    <input type="button" value="Send" onclick="send(this.form.message.value)">
    <textarea id="responseText" style="height:300px;width:300px"></textarea>
    <input type="button" value="Clear" onclick="document.getElementById('responseText').value=''">
</form>
</body>
</html>

TCP

传输控制协议(Transmission Control Protocol),TCP协议是面向连接的通信协议,即在传输数据之前发送端和接收端建立逻辑连接,然后进行传输数据,它提供了两台计算机之间可靠无差错的数据传输;在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”,TCP的客户端和服务端断开连接时候需要四次挥手

三次握手

TCP三次握手
  • 第一次握手:客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。(客户端向服务器端发出连接请求,等待服务器确认)
  • 第二次握手:服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态(服务器端向客户端回送一个响应,通知客户端收到了连接请求)
  • 第三次握手:客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态(客户端再次向服务器端发送确认信息,确认连接)

三次握手结束,TCP客户端和服务器端成功地建立连接,接下来可以开始传输数据~

四次挥手

  • 客户端打算关闭连接,此时会发送一个TCP首部FIN标志位被置为1的报文,即FIN报文,之后客户端进入FIN_WAIT_1状态
  • 服务端收到该报文后,就向客户端发送ACK应答报文,接着服务端进入CLOSED_WAIT状态
  • 客户端收到服务端的ACK应答报文后,之后进入FIN_WAIT_2状态
  • 等待服务端处理完数据后,也向客户端发送FIN报文,之后服务端进入LAST_ACK状态
  • 客户端收到服务端的FIN报文后,回一个ACK应答报文,之后进入TIME_WAIT状态
  • 服务器收到了ACK应答报文后,就进入了CLOSE状态,至此服务端已经完成连接的关闭
  • 客户端在经过2MSL一段时间后,自动进入CLOSE状态,至此客户端也完成连接的关闭

由上图可以知道,每个方向都要有一个FIN和一个ACK,因此通常被称为四次挥手。这一点注意:主动关闭连接的,才可进入TIME_WAIT状态

UDP

  • 用户数据报协议(User Datagram Protocol)(数据报(Datagram)是UDP网络传输的基本单位)
  • UDP是无连接通信协议,即在数据传输时数据的发送端和接收端不建立逻辑连接。即当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
  • 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
  • 但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时,不建议使用UDP协议

IP协议

概念

IP协议(Internet Protocol)又称互联网协议,是支持网间互联的数据包协议。该协议工作在网络层,主要目的就是为了提高网络的可扩展性,与传输层TCP相比,IP协议提供一种无连接/不可靠、尽力而为的数据包传输服务,其与TCP协(传输控制协议)一起构成了TCP/IP协议族的核心

分类
  • IPv4:为每个连接在网络上的主机分配一个32bit地址。按照TCP/IP规定,IP地址用二进制来表示且每个IP地址长32bit,即4个字节;为了方便使用IP地址采用点分十进制,如“192.168.1.66”
  • IPv6: 由于互联网的蓬勃发展,IP地址的需求量越来越多,为了扩大地址空间,通过IPv6采用128位地址长度定义地址,这样就解决了网络地址资源数量不够的问题

  • 常用命令:
    ① ipconfig:查看本机 IP 地址(Linux下对应ifconfig)
    ② ping IP 地址:检查网络是否连通。

其他

websocket && HTTP协议的区别

相同点

都是应用层协议,用于在客户端和服务器之间传输数据

不同点

  • 建立连接的方式不同
    • 在HTTP中,每次请求都需要重新建立连接。当一个Web页面需要不断地向服务器发送请求时,每次请求都需要重新建立连接,这会导致连接开销和网络延迟
    • 而在WebSocket中,客户端和服务器之间只需要建立一次连接,之后就可以保持连接状态并进行双向通信
  • 数据传输方式不同
    • 在HTTP中,数据的传输是通过请求-响应模式进行的。客户端发送请求->服务器返回响应,该过程中的客户端和服务器之间的通信都是通过文本进行的
    • 而在WebSocket中,客户端和服务器之间的通信是以二进制形式进行的。这意味着,WebSocket可以更快地传输数据,并且能够处理更复杂的数据类型
  • 支持的数据类型不同
    • 在HTTP中,支持的数据类型是有限的。通常只支持文本、图像和音频等静态数据类型
    • 而在WebSocket中,由于数据传输是以二进制形式进行的,因此可以支持更复杂的数据类型,例如视频流和实时游戏数据等
  • 安全性不同
    • 在HTTP中,数据是以明文形式进行传输的,因此容易被窃取或篡改。为了解决这个问题引入了HTTPS
    • 而在WebSocket中,数据是以二进制形式进行传输的,因此安全性更高,不容易被窃取或篡改。
  • 实时性不同
    • 由于HTTP的请求-响应模式,客户端只能在收到服务器响应后才能更新数据。即在实时性要求较高的应用中,HTTP可能无法满足需求
    • 而WebSocket可以实现实时的双向通信,因此在实时性要求较高的应用中更为适用

猜你喜欢

转载自blog.csdn.net/qq_34020761/article/details/132332912