计算机网络与JavaWeb简单笔记

计算机网络与JavaWeb简单笔记

VUE-》ES6-》JavaScript-》
axios-》Ajax-》HTTP

OSI七层模型和TCP/IP四层模型

参考:https://blog.csdn.net/qq2399431200/article/details/94875176

TCP/IP:

代表传输控制协议/网际协议,指的是一系列协议,TCP/IP 模型在 OSI 模型的基础上进行了简化,变成了四层,从下到上分别为:网络接口层、网络层、传输层、应用层。与 OSI 体系结构对比如下:

img

TCP/IP的分层

img

HTTP:应用层协议(货物)

HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

TCP和UDP:传输层协议(卡车)

IP:网络层协议(高速公路)

SOCKET:套接字(港口码头/车站)

TCP/IP网络的API。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

网络核心

分组交换

端系统(应用层)交换报文时,源(运输层TCP和网络层IP)将长报文划分为较小的数据块,称之为分组(packet)。这些分组都会通过通信链路和分组交换机(路由器和链路层交换机)

分组交换机(路由器)中可能存在排队时延和分组丢失。

TCP/IP学习(待更)

TCP协议简单概念

T C P / I P协议族分为四层:链路层、网络层、运输层和应用层,每一层各有不同的责任。

在T C P / I P中,网络层和运输层之间的区别是最为关键的:网络层( I P)提供点到点的服务,而运输层(T C P和U D P)提供端到端的服务。

什么是 TCP 连接?

我们来看看 RFC 793 是如何定义「连接」的:

简单来说就是,⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗⼝⼤⼩称为连接。

  • Socket:由 IP 地址和端⼝号组成
  • 序列号:⽤来解决乱序问题等
  • 窗⼝⼤⼩:⽤来做流量控制

总结:TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

TCP重传

  • 超时重传
  • 快速重传
  • SACK
  • D-SACK

超时重传

​ 重传机制的其中⼀个⽅式,就是在发送数据时,设定⼀个定时器,当超过指定的时间后,没有收到对⽅的 ACK 确认应答报⽂,就会重发该数据,也就是我们常说的超时重传

TCP 会在以下两种情况发⽣超时重传:

  • 数据包丢失
  • 确认应答丢失

快速重传机制

image-20211029155254764

如图,由于接收方未接收到ack2的报文段,故会重新发送ack2的包给发送端。

快速重传的⼯作⽅式是当收到三个相同的 ACK 报⽂时,会在定时器过期之前,重传丢失的报⽂段。

快速重传机制只解决了⼀个问题,就是超时时间的问题,但是它依然⾯临着另外⼀个问题。就是重传的时候,是重传之前的⼀个,还是重传所有的问题。

流量控制

TCP 通过让接收⽅在确认报文中指明希望从发送⽅接收的数据⼤⼩(窗⼝⼤⼩)来进行流量控制

image-20210911164712576

拥塞控制

当⽹络发送拥塞时,TCP 会⾃我牺牲,降低发送的数据量。于是就有了拥塞控制,控制的⽬的就是避免「发送⽅」的数据填满整个⽹络。

image-20210911164553866

TCP相关问题

什么是 TCP连接

⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

SYN:同步序列编号(Synchronize Sequence Numbers )。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

tcp三次握手建立连接

image-20211016004109845

第一次握手:客户端发送syn包(seq序列号=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(即发送ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

形象理解:

主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?seq是我的序列号!”,这是第一次对话;

主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?这是我的序列号”,这是第二次对话;

主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。

三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

为什么是三次握⼿?不是两次、四次?

  • 三次握⼿才可以解决“网络中存在延迟的重复历史连接”的问题
  • 三次握⼿才可以同步双方的初始序列号
  • 三次握⼿才可以避免资源浪费

不使⽤「两次握⼿」和「四次握⼿」的原因:

「两次握⼿」:⽆法防⽌历史连接的建⽴,即服务器端如果接收到多次同样的syn包就会建立多个连接,会造成双⽅资源的浪费,也⽆法可靠的同步双⽅序列号;

「四次握⼿」:三次握⼿就已经理论上最少可靠连接建⽴,所以不需要使⽤更多的通信次数。

这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值。所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的。

外链参考:TCP 为什么是三次握手,而不是两次或四次? - wuxinliulei的回答 - 知乎 https://www.zhihu.com/question/24853633/answer/63668444

syn洪泛攻击

应对方式:SYN cookie

在接收到客户端的第一次握手后,服务器先不立刻分配半开连接资源,而是使用一个根据双方信息生成的唯一cookie值作为服务器的初始序列号,打包成SYN+ACK包发送给客户端,若客户端是正常的回应则会在此cookie值上加一作为自身报文段的ack发送给服务器,服务器接收到则正常分配资源建立连接。

四次挥手

TIME_WAIT(定时等待):主动关闭方在发送最后一条ACK报文之后会有一段等待时间,称为 TIME_WAIT。

为什么需要 TIME_WAIT 状态?

答:需要 TIME-WAIT 状态,主要是两个原因:

  • 防⽌具有相同「四元组」的「旧」数据包被收到;
  • 保证「被动关闭连接」的⼀⽅能被正确的关闭,即保证最后的 ACK 能让被动关闭⽅接收,从⽽帮助其正常关闭;

TCP UDP 区别:

1. 连接

TCP 是⾯向连接的传输层协议,传输数据前先要建⽴连接。

UDP 是不需要连接,即刻传输数据。

2. 服务对象

TCP 是⼀对⼀的两点服务,即⼀条连接只有两个端点。

UDP ⽀持⼀对⼀、⼀对多、多对多的交互通信

3. 可靠性

TCP 是可靠交付数据的,数据可以⽆差错、不丢失、不᯿复、按需到达。

UDP 是尽最⼤努⼒交付,不保证可靠交付数据。

4. 拥塞控制、流ᰁ控制

TCP 有拥塞控制和流ᰁ控制机制,保证数据传输的安全性。

UDP 则没有,即使⽹络⾮常拥堵了,也不会影响 UDP 的发送速率。5. ⾸部开销

TCP ⾸部⻓度较⻓,会有⼀定的开销,⾸部在没有使⽤「选项」字段时是 20 个字节,如果使⽤了「选项」

字段则会变⻓的。

UDP ⾸部只有 8 个字节,并且是固定不变的,开销较⼩。

6. 传输⽅式

TCP 是流式传输,没有边界,但保证顺序和可靠。

UDP 是⼀个包⼀个包的发送,是有边界的,但可能会丢包和乱序。

7. 分⽚不同

TCP 的数据⼤⼩如果⼤于 MSS ⼤⼩,则会在传输层进⾏分⽚,⽬标主机收到后,也同样在传输层组装 TCP

数据包,如果中途丢失了⼀个分⽚,只需要传输丢失的这个分⽚。

UDP 的数据⼤⼩如果⼤于 MTU ⼤⼩,则会在 IP 层进⾏分⽚,⽬标主机收到后,在 IP 层组装完数据,接着再

传给传输层,但是如果中途丢了⼀个分⽚,在实现可靠传输的 UDP 时则就需要᯿传所有的数据包,这样传输

效率⾮常差,所以通常 UDP 的报⽂应该⼩于 MTU。

HTTP学习

概念

特点:无连接(TCP短连接)、无状态

http 为短连接:客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。

复习推荐参考链接(TCP/HTTP/SOCKET):https://blog.csdn.net/user11223344abc/article/details/83780448

HTTP事务概念

image-20210805112457002

常见方法

image-20210805112207018

报文

image-20210805114732384

image-20210805114855867

起始行(请求行,响应行)

请求行:存放请求类型,url资源路径,http版本号等

响应行:存放http版本号,响应状态等

首部字段(headers)

请求:存放请求体内容的类型,cookie信息等

主体(body)

请求报文

重点是格式与参数

行      POST  /s?ie=utf-8  HTTP/1.1 
头      Host: atguigu.com
        Cookie: name=guigu
        Content-type: application/x-www-form-urlencoded
        User-Agent: chrome 83
空行
体      username=admin&password=admin
响应报文
行      HTTP/1.1  200  OK
头      Content-Type: text/html;charset=utf-8
        Content-length: 2048
        Content-encoding: gzip
空行    
体      <html>
            <head>
            </head>
            <body>
                <h1>尚硅谷</h1>
            </body>
        </html>

与TCP/IP的关系概念

image-20210805115622307

也可以理解为依赖关系,高层的协议依赖于底层的协议:

img

HTTP 状态码

服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。

状态码 类别 含义
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

注:

  • 301 Moved Permanently :永久性重定向

  • 302 Found :临时性重定向

  • 403 Forbidden :请求被拒绝。

  • 404 Not Found

  • 500:INTERNAL SERVER ERROR 服务器发生错误。 ...

HTTP HTTPS

HTTP 与 HTTPS 有哪些区别?

  1. HTTP 是超⽂本传输协议,信息是明⽂传输,存在安全⻛险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在TCP 和 HTTP ⽹络层之间加⼊了 SSL/TLS 安全协议,它使用安全套接字层([SSL])进行信息交换,简单来说它是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。

  2. HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。

  3. HTTP 的端⼝号是 80,HTTPS 的端⼝号是 443。

  4. HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

image-20211005214513507

注:

  1. TLS/SSL全称安全传输层协议Transport Layer Security,是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用[HTTPS]基本上不需要对HTTP页面进行太多的改造。
  2. 混淆SSH,SSH是连接协议

HTTP 连接和 SOCKET连接 的区别

很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。

若双方是 Socket 连接(长连接),建立连接后可以由服务器直接向客户端发送数据,参考Java套接字编程。

  • Socket是应用层与传输层之间的同一个抽象层,它是一套接口,所以Socket连接可以基于TCP连接,也有可能基于UDP;
  • 我们知道,TCP协议是可靠的,UDP协议是不可靠的,那么基于TCP协议的Socket连接同样是可靠的;
  • 基于UDP协议的Socket连接是不可靠的,大多数的即时通讯工具都是基于后者实现的。

若双方是 HTTP 连接(短连接),则服务器需要等客户端发送请求后,才能将数据回传给客户端。

  • 在网络分层中,HTTP协议是基于TCP协议的;
  • 客户端向服务端发送一个HTTP请求时,需要先与服务端建立TCP连接,也就是经典的三次握手(通常对用- 户来说是很难察觉的),握手成功以后才能进行数据交互;
  • HTTP是基于请求响应模式且无状态的协议,1.1之前只支持短连接,也就是请求响应一次以后连接中断,下次请求需要重新进行TCP连接,而1.1之后支持持长连接,即进行一次TCP连接以后,客户端可以发送多次的HTTP请求给服务器端。

详细参考链接:https://www.cnblogs.com/zhuleixiao/p/9218121.html

HTTP-web服务器(tomcat)接收到client请求后的处理过程(大致流程)

\1. 客户发起情况到服务器网卡;

\2. 服务器网卡接受到请求后转交给内核处理;

\3. 内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程

\4. Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)

\5. 内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘

\6. 内核调度磁盘,获取需要的资源

\7. 内核将资源存放在自己的缓冲区中,并通知Web服务器进程

\8. Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中

\9. Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求

\10. 内核将响应发送至网卡

\11. 网卡发送响应给用户

通过这样的一个复杂过程,一次请求就完成了。

简单来说就是:用户请求-->送达到用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源->返回到用户空间->响应给用户。上述简单的说明了一下,客户端向Web服务请求过程,在这个过程中,有两个I/O过程,一个就是客户端请求的网络I/O,另一个就是Web服务器请求页面的磁盘I/O。

参考链接:https://blog.csdn.net/l1394049664/article/details/82313414

常见问题

Get和post的区别是什么?

  1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。
  2. Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
  3. Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
  4. Get执行效率却比Post方法好。Get是form提交的默认方法。

Cookie和Session的作用和工作原理

Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie

Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

作用

Cookie的根本作用就是在客户端存储一些服务器相关的信息。典型的应用有:

1、记住密码,下次自动登录。

2、购物车功能。

3、记录用户浏览数据,进行商品(广告)推荐。

(4)缺陷

①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。

②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)

③Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。

Session的根本作用就是在服务端存储用户和服务器会话的一些信息。

https://www.cnblogs.com/isme-zjh/p/11359557.html

区别

  • 存放位置不同
  • **对服务器造成的压力不同 **
  • 安全性(隐私策略)的不同
  • 存储形式的不同(Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。而Session中能够存取任何类型的数据,能够把Session看做是一个Java容器类)

重定向和转发的区别

1、请求次数

  • 重定向是客户端向服务器发送一个请求,服务器返回一个地址响应客户端,客户端收到后需再次向这个新地址发出请求。
  • 转发是服务器收到请求后为了完成响应跳转到一个新的地址;
  • 重定向至少请求两次,转发请求一次;

2、浏览器地址栏url不同

重定向地址栏会发生变化,转发地址栏不会发生变化;

3、是否共享数据

  • 重定向两次请求不共享数据,会丢失第一次的请求数据
  • 转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

4、跳转限制

重定向可以跳转到任意URL,转发只能跳转本站点资源;

注:转发比重定向快,因为重定向经过客服端,而转发没有。但是,又是采用重定向更好,若需要重定向到一个外部网站,则无法使用转发。

参考:https://blog.csdn.net

DNS 工作原理

image-20211022021504899

浏览器输入网址

  1. 检测浏览器的DNS解析器缓存,如果有则返回ip解析结束,缓存时间由TTL属性设置
  2. 浏览器未找到则在操作系统的host文件中查找
  3. 继续到本地DNS服务器上查找,这个地址是在本机的IP设置中的DNS值获取的,也可动态获取,如学校,小区互联网应用提供商等
  4. 本地DNS中如果未找到便会去问它的根域名服务器,根域名服务器是最⾼层次的,它不直接⽤于域名解析,但能指明⼀条道路。
  5. 根域名再返回相应的根域位置给本地DNS,如.com/.cn/.net等等,让本地DNS再去问它

img

浏览器输入网址到网页显示期间发生了什么?

HTTP:将请求信息封装成http报文

DNS

TCP

IP:在ip头部加入源ip地址与目标ip地址,协议号等

ARP协议获取MAC

网卡将包发送出去

什么是跨域?如何解决跨域问题?

什么是跨域?
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
域名:
 主域名不同 http://www.baidu.com/index.html -->http://www.sina.com/test.js
 子域名不同 http://www.666.baidu.com/index.html -->http://www.555.baidu.com/test.js
 域名和域名ip http://www.baidu.com/index.html -->http://180.149.132.47/test.js
端口:
 http://www.baidu.com:8080/index.html–> http://www.baidu.com:8081/test.js
协议:
 http://www.baidu.com:8080/index.html–> https://www.baidu.com:8080/test.js
备注:
 1、端口和协议的不同,只能通过后台来解决
 2、localhost和127.0.0.1虽然都指向本机,但也属于跨域

如何解决?

服务端使用cors

https://www.cnblogs.com/itmacy/p/6958181.html

原文链接:https://blog.csdn.net/tjcjava/article/details/76468225

防火墙技术

防火墙技术一般分为两类,即: (1)、分组过滤路由器 (2)、应用网关也称为代理服务器

posted @ 2022-03-01 08:43  Y鱼鱼鱼Y  阅读(67)  评论(0编辑  收藏  举报