JavaWeb入门 - 你必须知道的预备知识

大家好,我是一只学弱狗,记录学习的点点滴滴!

优质文章

  • 一张黄图的故事
  • JavaSE练习项目
  • 我是菜鸟、我小试牛刀
  • linux指令太多记不住?小白看这篇就够了!

优质专栏

  • 数据库就该这样学
  • 爪哇外步篇

写在前面

非常高兴迈入了JavaEE的学习,对Java Web的开发也充满着无限的期待,从今天起,我将不断的和大家分享学习经验和所思所感,从JavaWeb基础到Spring框架、互联网架构、微服务架构和分布式,记录自己的成长,同时也希望对大家有所帮助。

通过本文,你可以学到什么?

  • 什么是JavaSE? 什么是Java EE?什么是Java Web?
  • 网络通信的三要素是什么?
  • 什么是TCP/IP协议?什么是TCP协议?什么是UDP协议?HTTP协议又是什么?它们有怎样的区别和联系?
  • Windows操作系统下如何查看本机的IP地址及各个应用程序的端口号?
  • 什么是URL、URI和URN,其区别是什么?
  • HTTP协议的请求消息数据格式和响应消息数据格式分别是怎样的?

JavaSE、JavaEE和Java Web

JavaSE

是Java Standard Edition的缩写,即Java标准版,可开发一般的Java程序,例如桌面程序,可看做是JavaEE的子集

JavaEE

是Java Enterprise Edition的缩写,即Java企业版,是在JavaSE的基础上构建的,它提供了Web服务、组件模型、管理和通信API,以实现企业级的面向服务体系结构和Web应用程序,泛指Java语言在企业级开发中使用的技术规范的总和

Java Web

是用Java技术来解决相关Web互联网领域的技术总和,Web包括:服务器和客户端两部分,Java在客户端的应用有Java Applet,在服务器端的应用有Servlet、JSP和第三方框架等等,Java技术对Web领域的发展注入了强大的动力,Java的Web框架虽各不相同,但也都是遵循特定的路数的,使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定XML或Annotation实现配置,运用Java面向对象的特点,面向对象实现请求响应的流程,支持Jsp,Freemarker等视图。

网络通信三要素

  1. IP:指IP地址,是电子设备在网络中的唯一标识
  2. 端口:应用程序在计算机中的唯一标识
  3. 传输协议:规定数据传输的规则

TCP/IP协议、TCP协议、UDP协议和HTTP协议

TCP/IP协议

又名网络通讯协议,即传输控制协议/互联网协议,是一个网络通信模型,以及整个网络通信协议家族,是Internet最基本的协议,是一个协议簇,包含应用层、传输层、网际层和网络接口

TCP协议

概念

是Transmission Control Protocol 的缩写,即传输控制协议,是面向连接的协议, 可靠的,基于字节流的传输层通信协议

TCP报文格式

序号seq用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
确认号ack只有当ACK标志位为1时,确认序号才有效,ack=seq+1
标志位URG紧急指针有效
标志位ACK确认序号有效
标志位PSH接收方应该尽快将这个报文交给应用层
标志位RST重置连接
标志位SYN发起一个新连接
标志位FIN释放一个连接
三次握手

第一次握手:客户端向服务器端发送请求报文,其中同步序列编号SYN=1,序号seq=x(表明传送数据时的第一个数据字节的序号是x),进入SYN-SENT(同步已发送状态)状态,等待服务器确认。
第二次握手:服务器端收到客户端发来的请求,如果同意建立连接,就发回一个确认报文,该报文中标志位SYN=1,序号seq=y,标志位ACK=1,确认序号ack=x+1,此时服务器端进入SYN-RCVD(同步收到)状态。
第三次握手:客户端收到服务器端确认报文后,还需要向服务器给出确认,seq=x+1,发送确认包ACK=1,ack=y+1,客户端进入ESTABLESHED(已连接状态),当服务端收到确认后,也进入ESTABLISHED状态,进而完成三次握手,

为什么需要三次握手,而不是两次?

因为TCP协议必须保证通信双方都有能力发送信息并且接受响应,第一次握手,当客户端发送给服务器时,服务器知道客户端的发送是正常的,服务器的接收也是正常的。

第二次握手,当服务器发送给客户端信息时,客户端知道自己的发送和接受都是正常的,也说明客户端知道了服务器端的发送和接收都是正常的。

第三次当客户端再发送给服务器的确认报文的时候,服务器就知道了自己的发送是正常的,同时客户端的接受也是正常的。

四次挥手

第一次挥手:客户端进程发出连接释放报文,并且停止发送数据,标志位FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),客户端进入FIN-WAIT-1状态。
第二次挥手:服务器端收到连接释放报文,发出确认报文,标志位ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时服务器就进入了CLOSE-WAIT状态,TCP服务器通知高层的应用进程,客户端向服务器端的方向释放了,此时处于半关闭状态,即客户端已经没有数据要发送了,但是若服务器端发送数据,客户端仍然需要接受,当客户端收到服务器的确认信息后,客户端进入FIN-WAIT-2状态。
第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器端很可能又发送了一些数据,假定此时的序列号seq为w,此时服务器就进入了LAST-ACK状态,等待客户端的确认。
第四次挥手:客户端收到服务器端的连接释放报文后,必须发出确认,标志位ACK=1,ack=w+1,此时客户端进入了TIME-WAIT(时间等待)状态,此时TCP连接仍还未释放,必须经过2MSL的时间后,当客户端撤销TCB后,才进入CLOSED状态,当服务端收到确认信息后,进入CLOSED状态。

为什么需要四次挥手,而不是三次?

首先,三次握手,其实也是四次,只是将第二步和第三步做了一个合并,所以变成了三次,然而挥手不行,因为当客户端向服务端发送FIN报文的时候,仅仅表示客户端不再发送数据,但是还能接受数据,服务器收到客户端的FIN报文后,先回一个ACK应答报文,而服务器可能还有数据需要处理和发送,只有等到服务端不再发送数据时才发送FIN给客户端,表示同意关闭连接,故不能和三次握手的时候一样进行合并。

最后为什么要等待一个两倍的msl时间而不能直接关闭?

MSL(Maximum Segment Lifetime),指报文最大的生存时间,任何报文在网络上存在的时间超过这个时间的话,将会被丢弃,报文一来一回刚好是两倍的MSL,如果服务端没有收到客户端最后ACK报文,那超时后服务器端会重发FIN报文,那么当客户端再次接受到这个重传的FIN报文之后会再次发送ACK,若此时服务端收到客户端发来的ACK后就不会再发送任何消息,因此客户端为了服务端能收到ACK报文,必须等待一段时间,最坏情况下就是ACK的最大存活时间+FIN消息的最大存活时间,刚好是2MSL。另一个重要的原因,如果网络中有一个迟到的数据包没有被服务端接收,断开连接后,客户端又在相同的端口与服务器进行了一个新的连接,此时迟到的数据包到达服务端,那这个数据包就会让服务端以为是新的客户端发送过来的消息,因此,在经过2MSL时间后,足以让两个方向的数据都被丢弃,这样新的连接就不会接受过期的数据报文。

UDP协议

是User Data Protocol的缩写,即用户数据报协议,是一个非连接的协议,传输数据之前源端和终端不建立连接,故不需要维护连接状态,可同时向多个客户端传送信息,无法得知数据是否完全完整到达目的端

HTTP协议

概念:超文本传输协议(Hyper Text Transfer Protocal)
作用定义了客户端和服务器端通信时,发送数据的格式,说的简单一点,由于市面上的浏览器众多,各个浏览器都有自己的请求消息和响应的格式,对于服务器而言,就需要判断该请求由哪个浏览器发出,并根据浏览器做出相应的响应,对于服务器而言,势必会增加诸多的压力,故提出了HTTP协议。
特点

  1. 无连接限制每次连接只处理一个请求,服务器端处理完客户端的请求并收到客户端的应答后,即断开连接,但HTTP1.1版本后不会立即关闭连接。
  2. 无状态:指协议对于事务处理没有记忆能力,服务器端不知道客户端是什么状态,即服务器接收到客户端的请求并响应后,不会记录任何信息。
  3. 灵活:允许传输任意类型的数据对象。

交互流程

  1. 客户端和服务器端建立连接
  2. 客户端发送请求到服务器端
  3. 服务器端接收到请求后,进行处理,将处理结果响应给客户端
  4. 关闭连接
三者的区别

TCP和UDP是传输层的协议,而HTTP是应用层协议。

Dos常见命令

  1. ipconfig:查看本机IP地址
  2. netstat -an:查看TCP和UDP端口信息

URI、URL和URN

  • URI(Uniform Resource Identifier):统一资源标识符,用来唯一的标识一个资源,可以分为URL、URN或两者都是
  • URL(Uniform Resource Locator):统一资源定位符,是一种具体的URI,是URI的子集,除了确认一个资源,还提供一种定位该资源的主要访问机制,即URL可以用来标识一个资源,还可指明如何定位这个资源。
  • URN(Uniform Resource Name):统一资源命名:通过名字来标识资源

请求消息数据格式

  1. 请求行:包含请求方法、请求URL和请求协议版本
  2. 请求头:格式为请求头名称:请求头值,客户端浏览器告诉服务器一些信息。比如User-Agent:浏览器版本信息;Accept:客户端可识别的内容类型列表;Connection:keep-alive,连接可以被复用;Referer:告诉服务器当前请求从哪里来,作用是防盗链或做统计工作
  3. 请求空行:通知服务器一下不再有请求头,分割POST请求的请求头和请求体的
  4. 请求体(正文):封装POST请求消息的请求参数的

常见请求方式

请求方式描述
GETGET方式请求参数在请求行中,即URL后,请求的URL长度是有限制的,不太安全
POST向指定资源提交数据进行数据请求(提交表单或上传文件),数据被包含在请求体中,请求的URL长度没有限制,POST请求可能会导致新的资源的建立或已有资源的修改,相对安全
HEAD类似于GET请求,只不过返回的响应中没有具体内容,用于获取报头
PUT从客户端向服务器传送的数据取代指定的文档的内容
DELETE请求服务器删除指定的页面
CONNECTHTTP1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS允许客户端查看服务器的性能
TRACE回显服务器收到的请求,主要用于测试或诊断

响应消息数据格式

  1. 响应行:包含HTTP协议版本,状态码和状态码的文本描述,通过提供一个状态码来说明所请求的资源情况
  2. 消息头:服务器信息等。Content-type:服务器告诉客户端本次响应体数据格式以及编码格式;Content-disposition:服务器告诉客户端以什么样的格式打开响应体数据,默认值是in-line,在当前页面内打开,attachment;filename=xxx:以附件形式打开响应体,文件下载;
  3. 响应空行:通知服务器一下不再有消息头
  4. 响应体:传输的数据

常见响应状态代码和状态描述

状态码状态描述
1xx服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx的状态码
2xx成功。代表:200
3xx重定向。代表:302(重定向),304(访问缓存)
4xx客户端错误。代表:404(请求路径没有对应的资源)405(请求方式没有对应的方法)
5xx服务器端错误。代表:500:服务器内部出现异常

知识点回顾

      • JavaSE、JavaEE和Java Web
        • JavaSE
        • JavaEE
        • Java Web
      • 网络通信三要素
      • TCP/IP协议、TCP协议、UDP协议和HTTP协议
        • TCP/IP协议
        • TCP协议
          • 概念
          • TCP报文格式
          • 三次握手
          • 为什么需要三次握手,而不是两次?
          • 四次挥手
          • 为什么需要四次挥手,而不是三次?
          • 最后为什么要等待一个两倍的msl时间而不能直接关闭?
          • UDP协议
          • HTTP协议
          • 三者的区别
        • Dos常见命令
        • URI、URL和URN
        • 请求消息数据格式
        • 常见请求方式
        • 响应消息数据格式
        • 常见响应状态代码和状态描述

JavaWeb入门 - 你必须知道的预备知识

大家好,我是一只学弱狗,记录学习的点点滴滴!

优质文章

  • 一张黄图的故事
  • JavaSE练习项目
  • 我是菜鸟、我小试牛刀
  • linux指令太多记不住?小白看这篇就够了!

优质专栏

  • 数据库就该这样学
  • 爪哇外步篇

写在前面

非常高兴迈入了JavaEE的学习,对Java Web的开发也充满着无限的期待,从今天起,我将不断的和大家分享学习经验和所思所感,从JavaWeb基础到Spring框架、互联网架构、微服务架构和分布式,记录自己的成长,同时也希望对大家有所帮助。

通过本文,你可以学到什么?

  • 什么是JavaSE? 什么是Java EE?什么是Java Web?
  • 网络通信的三要素是什么?
  • 什么是TCP/IP协议?什么是TCP协议?什么是UDP协议?HTTP协议又是什么?它们有怎样的区别和联系?
  • Windows操作系统下如何查看本机的IP地址及各个应用程序的端口号?
  • 什么是URL、URI和URN,其区别是什么?
  • HTTP协议的请求消息数据格式和响应消息数据格式分别是怎样的?

JavaSE、JavaEE和Java Web

JavaSE

是Java Standard Edition的缩写,即Java标准版,可开发一般的Java程序,例如桌面程序,可看做是JavaEE的子集

JavaEE

是Java Enterprise Edition的缩写,即Java企业版,是在JavaSE的基础上构建的,它提供了Web服务、组件模型、管理和通信API,以实现企业级的面向服务体系结构和Web应用程序,泛指Java语言在企业级开发中使用的技术规范的总和

Java Web

是用Java技术来解决相关Web互联网领域的技术总和,Web包括:服务器和客户端两部分,Java在客户端的应用有Java Applet,在服务器端的应用有Servlet、JSP和第三方框架等等,Java技术对Web领域的发展注入了强大的动力,Java的Web框架虽各不相同,但也都是遵循特定的路数的,使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定XML或Annotation实现配置,运用Java面向对象的特点,面向对象实现请求响应的流程,支持Jsp,Freemarker等视图。

网络通信三要素

  1. IP:指IP地址,是电子设备在网络中的唯一标识
  2. 端口:应用程序在计算机中的唯一标识
  3. 传输协议:规定数据传输的规则

TCP/IP协议、TCP协议、UDP协议和HTTP协议

TCP/IP协议

又名网络通讯协议,即传输控制协议/互联网协议,是一个网络通信模型,以及整个网络通信协议家族,是Internet最基本的协议,是一个协议簇,包含应用层、传输层、网际层和网络接口

TCP协议

概念

是Transmission Control Protocol 的缩写,即传输控制协议,是面向连接的协议, 可靠的,基于字节流的传输层通信协议

TCP报文格式

序号seq用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
确认号ack只有当ACK标志位为1时,确认序号才有效,ack=seq+1
标志位URG紧急指针有效
标志位ACK确认序号有效
标志位PSH接收方应该尽快将这个报文交给应用层
标志位RST重置连接
标志位SYN发起一个新连接
标志位FIN释放一个连接
三次握手

第一次握手:客户端向服务器端发送请求报文,其中同步序列编号SYN=1,序号seq=x(表明传送数据时的第一个数据字节的序号是x),进入SYN-SENT(同步已发送状态)状态,等待服务器确认。
第二次握手:服务器端收到客户端发来的请求,如果同意建立连接,就发回一个确认报文,该报文中标志位SYN=1,序号seq=y,标志位ACK=1,确认序号ack=x+1,此时服务器端进入SYN-RCVD(同步收到)状态。
第三次握手:客户端收到服务器端确认报文后,还需要向服务器给出确认,seq=x+1,发送确认包ACK=1,ack=y+1,客户端进入ESTABLESHED(已连接状态),当服务端收到确认后,也进入ESTABLISHED状态,进而完成三次握手,

为什么需要三次握手,而不是两次?

因为TCP协议必须保证通信双方都有能力发送信息并且接受响应,第一次握手,当客户端发送给服务器时,服务器知道客户端的发送是正常的,服务器的接收也是正常的。

第二次握手,当服务器发送给客户端信息时,客户端知道自己的发送和接受都是正常的,也说明客户端知道了服务器端的发送和接收都是正常的。

第三次当客户端再发送给服务器的确认报文的时候,服务器就知道了自己的发送是正常的,同时客户端的接受也是正常的。

四次挥手

第一次挥手:客户端进程发出连接释放报文,并且停止发送数据,标志位FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),客户端进入FIN-WAIT-1状态。
第二次挥手:服务器端收到连接释放报文,发出确认报文,标志位ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时服务器就进入了CLOSE-WAIT状态,TCP服务器通知高层的应用进程,客户端向服务器端的方向释放了,此时处于半关闭状态,即客户端已经没有数据要发送了,但是若服务器端发送数据,客户端仍然需要接受,当客户端收到服务器的确认信息后,客户端进入FIN-WAIT-2状态。
第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器端很可能又发送了一些数据,假定此时的序列号seq为w,此时服务器就进入了LAST-ACK状态,等待客户端的确认。
第四次挥手:客户端收到服务器端的连接释放报文后,必须发出确认,标志位ACK=1,ack=w+1,此时客户端进入了TIME-WAIT(时间等待)状态,此时TCP连接仍还未释放,必须经过2MSL的时间后,当客户端撤销TCB后,才进入CLOSED状态,当服务端收到确认信息后,进入CLOSED状态。

为什么需要四次挥手,而不是三次?

首先,三次握手,其实也是四次,只是将第二步和第三步做了一个合并,所以变成了三次,然而挥手不行,因为当客户端向服务端发送FIN报文的时候,仅仅表示客户端不再发送数据,但是还能接受数据,服务器收到客户端的FIN报文后,先回一个ACK应答报文,而服务器可能还有数据需要处理和发送,只有等到服务端不再发送数据时才发送FIN给客户端,表示同意关闭连接,故不能和三次握手的时候一样进行合并。

最后为什么要等待一个两倍的msl时间而不能直接关闭?

MSL(Maximum Segment Lifetime),指报文最大的生存时间,任何报文在网络上存在的时间超过这个时间的话,将会被丢弃,报文一来一回刚好是两倍的MSL,如果服务端没有收到客户端最后ACK报文,那超时后服务器端会重发FIN报文,那么当客户端再次接受到这个重传的FIN报文之后会再次发送ACK,若此时服务端收到客户端发来的ACK后就不会再发送任何消息,因此客户端为了服务端能收到ACK报文,必须等待一段时间,最坏情况下就是ACK的最大存活时间+FIN消息的最大存活时间,刚好是2MSL。另一个重要的原因,如果网络中有一个迟到的数据包没有被服务端接收,断开连接后,客户端又在相同的端口与服务器进行了一个新的连接,此时迟到的数据包到达服务端,那这个数据包就会让服务端以为是新的客户端发送过来的消息,因此,在经过2MSL时间后,足以让两个方向的数据都被丢弃,这样新的连接就不会接受过期的数据报文。

UDP协议

是User Data Protocol的缩写,即用户数据报协议,是一个非连接的协议,传输数据之前源端和终端不建立连接,故不需要维护连接状态,可同时向多个客户端传送信息,无法得知数据是否完全完整到达目的端

HTTP协议

概念:超文本传输协议(Hyper Text Transfer Protocal)
作用定义了客户端和服务器端通信时,发送数据的格式,说的简单一点,由于市面上的浏览器众多,各个浏览器都有自己的请求消息和响应的格式,对于服务器而言,就需要判断该请求由哪个浏览器发出,并根据浏览器做出相应的响应,对于服务器而言,势必会增加诸多的压力,故提出了HTTP协议。
特点

  1. 无连接限制每次连接只处理一个请求,服务器端处理完客户端的请求并收到客户端的应答后,即断开连接,但HTTP1.1版本后不会立即关闭连接。
  2. 无状态:指协议对于事务处理没有记忆能力,服务器端不知道客户端是什么状态,即服务器接收到客户端的请求并响应后,不会记录任何信息。
  3. 灵活:允许传输任意类型的数据对象。

交互流程

  1. 客户端和服务器端建立连接
  2. 客户端发送请求到服务器端
  3. 服务器端接收到请求后,进行处理,将处理结果响应给客户端
  4. 关闭连接
三者的区别

TCP和UDP是传输层的协议,而HTTP是应用层协议。

Dos常见命令

  1. ipconfig:查看本机IP地址
  2. netstat -an:查看TCP和UDP端口信息

URI、URL和URN

  • URI(Uniform Resource Identifier):统一资源标识符,用来唯一的标识一个资源,可以分为URL、URN或两者都是
  • URL(Uniform Resource Locator):统一资源定位符,是一种具体的URI,是URI的子集,除了确认一个资源,还提供一种定位该资源的主要访问机制,即URL可以用来标识一个资源,还可指明如何定位这个资源。
  • URN(Uniform Resource Name):统一资源命名:通过名字来标识资源

请求消息数据格式

  1. 请求行:包含请求方法、请求URL和请求协议版本
  2. 请求头:格式为请求头名称:请求头值,客户端浏览器告诉服务器一些信息。比如User-Agent:浏览器版本信息;Accept:客户端可识别的内容类型列表;Connection:keep-alive,连接可以被复用;Referer:告诉服务器当前请求从哪里来,作用是防盗链或做统计工作
  3. 请求空行:通知服务器一下不再有请求头,分割POST请求的请求头和请求体的
  4. 请求体(正文):封装POST请求消息的请求参数的

常见请求方式

请求方式描述
GETGET方式请求参数在请求行中,即URL后,请求的URL长度是有限制的,不太安全
POST向指定资源提交数据进行数据请求(提交表单或上传文件),数据被包含在请求体中,请求的URL长度没有限制,POST请求可能会导致新的资源的建立或已有资源的修改,相对安全
HEAD类似于GET请求,只不过返回的响应中没有具体内容,用于获取报头
PUT从客户端向服务器传送的数据取代指定的文档的内容
DELETE请求服务器删除指定的页面
CONNECTHTTP1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS允许客户端查看服务器的性能
TRACE回显服务器收到的请求,主要用于测试或诊断

响应消息数据格式

  1. 响应行:包含HTTP协议版本,状态码和状态码的文本描述,通过提供一个状态码来说明所请求的资源情况
  2. 消息头:服务器信息等。Content-type:服务器告诉客户端本次响应体数据格式以及编码格式;Content-disposition:服务器告诉客户端以什么样的格式打开响应体数据,默认值是in-line,在当前页面内打开,attachment;filename=xxx:以附件形式打开响应体,文件下载;
  3. 响应空行:通知服务器一下不再有消息头
  4. 响应体:传输的数据

常见响应状态代码和状态描述

状态码状态描述
1xx服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx的状态码
2xx成功。代表:200
3xx重定向。代表:302(重定向),304(访问缓存)
4xx客户端错误。代表:404(请求路径没有对应的资源)405(请求方式没有对应的方法)
5xx服务器端错误。代表:500:服务器内部出现异常

知识点回顾

      • JavaSE、JavaEE和Java Web
        • JavaSE
        • JavaEE
        • Java Web
      • 网络通信三要素
      • TCP/IP协议、TCP协议、UDP协议和HTTP协议
        • TCP/IP协议
        • TCP协议
          • 概念
          • TCP报文格式
          • 三次握手
          • 为什么需要三次握手,而不是两次?
          • 四次挥手
          • 为什么需要四次挥手,而不是三次?
          • 最后为什么要等待一个两倍的msl时间而不能直接关闭?
          • UDP协议
          • HTTP协议
          • 三者的区别
        • Dos常见命令
        • URI、URL和URN
        • 请求消息数据格式
        • 常见请求方式
        • 响应消息数据格式
        • 常见响应状态代码和状态描述