• http协议浅分析


    http介绍

    超文本传输协议(HTTP)的设计目的是保证client和server之间的通信;

    HTTP 的工作方式是客户端与服务器之间的请求-应答协议。

    web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。

    举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式

    http请求(Spring)

    两种 HTTP 请求方法:GET 和 POST

    • Get:从指定的资源请求数据
    • Post:向指定的资源提交数据

    一般来说,GET 提交参数一般显示在 URL 上,POST 通过表单提交不会显示在 URL 上,POST 更具隐蔽性:
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    这里的GetMapping是为了从数据库中去拿到需要的用户信息

        @GetMapping("get_by_uid")
        public JsonResult<User> getByUid(HttpSession session) {
            // 从HttpSession对象中获取uid
            Integer uid = getUidFromSession(session);
            // 调用业务对象执行获取数据
            User data = userService.getByUid(uid);
            // 响应成功和数据
            return new JsonResult<User>(OK, data);
        }
        protected final Integer getUidFromSession(HttpSession session) {
            return Integer.valueOf(session.getAttribute("uid").toString());
        }
    

    关于下面的PostMapping是为了将提交的头像数据提交到数据库,属于提交资源

        @PostMapping("change_avatar")
        public JsonResult<String> changeAvatar(@RequestParam("file") MultipartFile file, HttpSession session) {
            // 判断上传的文件是否为空
            if (file.isEmpty()) {
                // 是:抛出异常
                throw new FileEmptyException("上传的头像文件不允许为空");
            }
    
            // 判断上传的文件大小是否超出限制值
            if (file.getSize() > AVATAR_MAX_SIZE) { // getSize():返回文件的大小,以字节为单位
                // 是:抛出异常
                throw new FileSizeException("不允许上传超过" + (AVATAR_MAX_SIZE / 1024) + "KB的头像文件");
            }
    
            // 判断上传的文件类型是否超出限制
            String contentType = file.getContentType();
            // boolean contains(Object o):当前列表若包含某元素,返回结果为true;若不包含该元素,返回结果为false
            if (!AVATAR_TYPES.contains(contentType)) {
                // 是:抛出异常
                throw new FileTypeException("不支持使用该类型的文件作为头像,允许的文件类型:" + AVATAR_TYPES);
            }
    
            // 获取当前项目的绝对磁盘路径
            String parent = session.getServletContext().getRealPath("upload");
            System.out.println(parent);
            // 保存头像文件的文件夹
            File dir = new File(parent);
            if (!dir.exists()) {
                dir.mkdirs();
            }
    
            // 保存的头像文件的文件名
            String suffix = "";
            String originalFilename = file.getOriginalFilename();
            int beginIndex = originalFilename.lastIndexOf(".");
            if (beginIndex > 0) {
                suffix = originalFilename.substring(beginIndex);
            }
            String filename = UUID.randomUUID().toString() + suffix;
    
            // 创建文件对象,表示保存的头像文件
            File dest = new File(dir, filename);
            // 执行保存头像文件
            try {
                file.transferTo(dest);
            } catch (IllegalStateException e) {
                // 抛出异常
                throw new FileStateException("文件状态异常,可能文件已被移动或删除");
            } catch (IOException e) {
                // 抛出异常
                throw new FileUploadIOException("上传文件时读写错误,请稍后重新尝试");
            }
    
            // 头像路径
            String avatar = "/upload/" + filename;
            // 从Session中获取uid和username
            Integer uid = getUidFromSession(session);
            String username = getUsernameFromSession(session);
            // 将头像写入到数据库中
            userService.changeAvatar(uid, username, avatar);
    
            // 返回成功头像路径
            return new JsonResult<String>(OK, avatar);
        }
    

    TCP的三次握手和四次挥手

    在这里插入图片描述

    三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

    那为什么要三次握手呢?两次不行吗?

    如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。

    在这里插入图片描述

    那为什么需要四次挥手呢?
    因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四次挥手。

    HTTP 与 HTTPS 的区别

    HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。

    HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。

    HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

    HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

    http和rpc异同

    聊聊socket(Java)

    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
    一个Socket是一对IP地址和端口。

    Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。

    要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket。
    根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    物 数 网 传 会 表 应
    HTTP 协议:超文本传输协议,对应于应用层,用于如何封装数据.
    TCP/UDP 协议:传输控制协议,对应于传输层,主要解决数据在网络中的传输。
    IP 协议:对应于网络层,同样解决数据在网络中的传输。

    http 为短连接:客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送"保持连接"的请求。这样可以保证客户端在服务器端是"上线"状态。

    HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。

    Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。
    创建 Socket 连接的时候,可以指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之。

    在这里插入图片描述

  • 相关阅读:
    Linux:ssh免密登陆
    java毕业设计——基于java+mysql+socket的即时通讯软件设计与实现(毕业论文+程序源码)——即时通讯软件
    【数据库原理与应用(第3版)】第一章:数据库系统概论(选择与填空)
    SpringBoot是什么?SpringBoot的优缺点有哪些?
    测试人员如何提交一条高质量的bug
    强化学习 DQN 速成
    秦九韶算法c++
    DOM之浏览器渲染流程 和重绘 回流
    【Revit二次开发】事务和事务处理(Transaction and FailureHandlingOptions)
    设计模式<二> :策略模式
  • 原文地址:https://blog.csdn.net/futurn_hero/article/details/127118190