计网面试复习自用

五层:

  1. 应用层:应用层是最高层,负责为用户提供网络服务和应用程序。在应用层,用户应用程序与网络进行交互,发送和接收数据。典型的应用层协议包括HTTP(用于网页浏览)、SMTP(用于电子邮件)、FTP(文件传输协议)等。用户应用程序产生数据,这些数据被封装成应用层数据包。

  2. 传输层:传输层位于应用层之下,主要负责数据的可靠传输和端到端通信。常见的传输层协议包括TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的、面向连接的通信,确保数据的完整性和顺序,而UDP提供不可靠的、面向无连接的通信。传输层将应用层数据包封装成传输层数据包,添加源和目标端口信息。

  3. 网络层:网络层是网络通信的下一层,它负责数据包的路由和转发,以确保数据能够跨越不同网络段到达目标主机。网络层使用IP地址来标识主机和路由器的位置。网络层将传输层数据包封装成网络层数据包,并添加源和目标IP地址信息。网络层的设备,如路由器,负责根据目标地址决定数据包的路径。

  4. 数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
  5. 物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。

在实际情况中,数据在这三个层次之间依次封装和解封装。例如,当您在网页浏览器中请求一个网页时,应用层生成HTTP请求,然后将其传递给传输层,通常使用TCP。传输层将数据包封装,并在数据包中添加源和目标端口信息。然后,传输层数据包传递给网络层,网络层将其封装,并在数据包中添加源和目标IP地址信息。最后,数据包在网络中路由和转发,经过网络层设备(如路由器),最终到达目标主机,然后在相反的顺序解封装,直到数据到达应用层,网页被显示在浏览器中。这个过程确保了数据的可靠传输和目标定位。

TCP的三次握手四次挥手

是的,三次握手和四次挥手是TCP(Transmission Control Protocol)协议中的重要概念,用于建立和终止TCP连接。

三次握手(Three-Way Handshake)

  1. 客户端向服务器发送一个SYN(同步)标志的数据包,表示客户端想要建立连接。
  2. 服务器收到客户端的SYN数据包后,回复一个ACK(确认)标志的数据包,同时也发送一个SYN标志的数据包,表示接受连接请求。
  3. 客户端收到服务器的ACK和SYN数据包后,回复一个ACK数据包,表示连接建立成功。此时,TCP连接已经建立。

四次挥手(Four-Way Handshake)

  1. 客户端发送一个FIN(结束)标志的数据包,表示不再发送数据。
  2. 服务器收到客户端的FIN数据包后,回复一个ACK数据包,表示确认收到客户端的结束请求。
  3. 服务器继续发送数据(如果有未发送完的数据),然后发送一个FIN数据包,表示服务器已经完成发送。
  4. 客户端收到服务器的FIN数据包后,回复一个ACK数据包,表示确认收到服务器的结束请求。此时,TCP连接被完全终止。

三次握手用于建立TCP连接,而四次挥手用于优雅地终止TCP连接。这些过程确保了数据的可靠传输和连接的安全关闭。

为什么四次挥手时服务端要发送两次,也就是为什么会有第三的个步骤

在TCP四次挥手中,服务端发送两次数据包的目的是确保数据的可靠传输和连接的正确终止。具体来说,第三个步骤(服务端发送第二个FIN数据包)是为了处理可能的延迟数据传输或未完成的数据包。让我详细解释:

扫描二维码关注公众号,回复: 17249270 查看本文章
  1. 客户端发送FIN:客户端首先发送一个带有FIN标志的数据包,表示不再发送数据,但仍愿意接收数据。

  2. 服务端发送ACK:服务端收到客户端的FIN后,发送一个ACK数据包,确认收到客户端的结束请求。

  3. 服务端继续传输:在一些情况下,服务端可能还有未发送完的数据,因此它继续发送数据,但这些数据不再包含应用层数据,而是用来填充TCP缓冲区的数据。

  4. 服务端发送第二个FIN:一旦服务端完成了所有数据的传输(包括填充的数据),它发送第二个FIN数据包,表示它已经完成数据传输,愿意关闭连接。

  5. 客户端发送ACK:客户端接收到服务端的第二个FIN后,发送一个ACK数据包,确认收到服务端的结束请求。此时,TCP连接被完全终止。

这个额外的步骤(第三个步骤)是为了确保在连接关闭之前,服务端有足够的时间将所有未完成的数据传输完毕。它也可以处理可能的数据包延迟或重排序的情况,以确保数据的可靠传输和连接的正确终止。通过这种方式,TCP提供了一种可靠的方式来结束连接,同时保证数据的完整性。

四次挥手时为什么有第三步

在一些情况下,服务端可能会在四次挥手的第三步(发送第二个FIN之前)继续发送数据,但这些数据通常是用来填充TCP缓冲区或处理未完成的数据传输的情况。以下是一些可能的案例:

  1. 延迟数据传输:在某些情况下,服务端可能会有一些数据包在等待传输给客户端,而在关闭连接之前,服务端希望确保这些数据包已经成功发送。这可以包括应用层数据的最后一部分,如果这些数据在连接关闭之前没有被传输,它们可能会丢失。服务端继续传输这些数据,直到它们全部被发送。

  2. TCP缓冲区数据:TCP协议使用缓冲区来管理数据的传输。有时,这些缓冲区可能包含尚未发送的数据或等待确认的数据。服务端需要等待客户端确认接收这些数据,以确保它们已经成功传输。

  3. 未确认数据包:如果服务端发送了一些数据包但尚未收到客户端的确认,它可能会继续发送这些数据包,以确保客户端已经成功接收它们。这是TCP的可靠性机制的一部分。

总之,服务端在第三步(发送第二个FIN之前)继续发送数据的情况通常是为了处理未完成的数据传输,确保数据的可靠传输,以及正确终止连接。这有助于避免数据的丢失或不完整,同时保持连接的可靠性。

例子:

  1. 客户端发送消息:用户在前端输入并发送一条聊天消息。

  2. 后端接收消息:Spring Boot应用接收到这条消息。

  3. 处理消息:Spring Boot应用可能需要对这条消息进行一些处理,例如验证、加工或路由。这个处理过程可能需要一些时间,特别是如果有多个用户在同时发送消息,Spring Boot需要适当地处理所有这些消息。

  4. 实际传输:一旦后端完成了消息的处理,它会将这条消息发送给聊天中的其他用户。这个传输是实时的,但是在第3步中可能存在一些延迟,因为后端需要完成消息的处理。

所以,延迟数据传输在这个示例中是指在消息从客户端发送到实际传递给其他用户之间的时间延迟,这个延迟是由于消息在后端进行处理而引起的。这个延迟可以是短暂的,但在一些繁忙的聊天环境中,可能会积累一些时间。希望这个解释更加清晰

在日常生活中,有许多应用程序示例可以帮助解释客户端发起的第一次挥手操作。以下是一些具体操作的示例:

  1. Web浏览器关闭标签页:当您在Web浏览器中打开一个网页标签页并完成了阅读后,您可以通过单击标签页上的关闭按钮来关闭该标签页。这个操作等同于客户端(浏览器)发起的第一次挥手,客户端表明不再需要与该网站的连接。

  2. 手机应用关闭:当您使用手机上的应用程序(例如社交媒体应用、游戏、电子邮件应用等)时,当您不再需要应用程序时,您可以通过按下主屏幕按钮、滑动应用程序关闭或使用操作系统提供的应用程序关闭功能来关闭应用程序。这是类似于客户端发起的第一次挥手,表明客户端不再需要与服务端的连接(服务器)。

  3. 电子邮件客户端:在电子邮件应用程序中,当您完成了发送或接收邮件的操作并关闭应用程序时,这等同于客户端发起的第一次挥手。客户端表明它不再需要与电子邮件服务器的连接。

  4. 文件传输应用程序:在文件传输应用程序中,例如FTP或P2P文件共享应用程序,当您完成文件上传或下载操作后,关闭应用程序就像客户端发起的第一次挥手,表示客户端不再需要与服务器的连接,因为文件传输已经完成。


TCP为什么不是两次握手

  1. 双向连接确认:三次握手确保了双方都同意建立连接。客户端发起第一次握手,服务端回应第二次握手,然后客户端再回应第三次握手。这种双向确认减少了因意外连接或恶意攻击引起的不必要连接。

  2. 避免失效连接的问题:如果TCP只使用两次握手,客户端发送第一次握手,服务端回应第二次握手后建立连接。但如果第一次握手丢失,客户端将不知道连接是否建立,而服务器已经认为连接已建立。这可能导致不一致性和潜在的问题。通过三次握手,客户端能够确认连接已建立。2.1连接不一致性:假设客户端发送了第一次握手,但该握手丢失,服务器未收到。客户端不会知道连接建立的情况,而服务器会认为连接已经建立。这会导致不一致性,因为客户端和服务器之间的连接状态不匹配。2.2资源泄漏:客户端未能知道连接的状态,可能会导致资源泄漏。如果客户端在认为连接已经建立的情况下开始发送数据,但实际上连接并未建立,服务器将浪费资源尝试接收和处理这些数据。2.3数据不完整性:如果连接状态不一致,客户端可能会认为连接已建立,但服务器可能不会接收客户端的数据。这可能导致客户端的数据丢失或未处理,导致数据不完整性。2.4安全性问题:连接不一致性可能会被恶意利用,例如中间人攻击,其中攻击者可能会伪造一个连接并开始发送数据,而客户端不知道连接状态不正确,从而可能接受来自攻击者的数据。

Http与Https之间的区别:

1 http 协议是免费使用的,而 https 协议需要到CA机构申请证书,需要缴纳费用
2 http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl/tls 加密传输协议,信息是密文
3 http 的连接很简单,是无状态的;https 协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全
4 和 http 通信相比,https 通信会由于加减密处理消耗更多的CPU和内存资源
5 http 和 https 使用的端口也不一样,前者是80,后者是443

什么事对称加密与非对称加密,以及常见的加密协议

对称加密非对称加密是两种不同的加密技术,用于保护数据的机密性。它们在加密和解密过程中使用不同的密钥体系,以及具有不同的用途。

  1. 对称加密

    • 使用相同的密钥来加密和解密数据。
    • 加密和解密速度通常较快,因为使用的密钥简单,但存在共享密钥的问题。
    • 适用于大量数据的加密,例如数据传输的加密和存储设备的加密。
    • 常见的对称加密算法包括AES(高级加密标准)、DES(数据加密标准)和3DES等。
  2. 非对称加密

    • 使用一对密钥,包括公钥和私钥,其中公钥用于加密,私钥用于解密。
    • 加密和解密速度通常较慢,因为使用的密钥复杂,但提供了更好的安全性。
    • 适用于密钥交换、数字签名和身份验证等场景。
    • 常见的非对称加密算法包括RSA、DSA、ECC(椭圆曲线密码学)等。

常见的加密协议通常结合了对称和非对称加密技术以提供综合的安全性,其中对称加

Tcp的长连接短连接

连接和短连接:

  • HTTP1.0默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
  • HTTP/1.1起默认使用长连接。要使用长连接,客户端和服务器的HTTP响应头部的Connection要设置为keep-alive,才能支持长连接

 GET与POST的区别

  • GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL拼接传递,POST参数通过请求体传递
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。{1GET请求对参数的数据类型有限制,因为它们需要出现在URL中,因此只能包含ASCII字符,而对于非ASCII字符(如汉字或特殊符号),需要进行URL编码。2POST请求的参数通常包含在请求的正文中,因此可以包含各种数据类型,包括二进制数据、JSON、XML等,而不仅限于ASCII字符。

    例子: 假设您正在开发一个网站的搜索功能。如果用户在搜索框中输入了搜索关键字"购物",则可以使用GET请求来向服务器发送请求,如下所示:

     

    perlCopy code

    GET http://example.com/search?keyword=%E8%B4%AD%E7%89%A9

    在这个例子中,搜索关键字"购物"被URL编码为%E8%B4%AD%E7%89%A9,以适应GET请求的要求。这个关键字以明文形式显示在URL中。

  • }

TCP和UDP区别和应用

  • TCP是可靠传输,UDP是不可靠传输;
  • TCP面向连接,UDP无连接,即发送数据之前不需要建立连接
  • TCP传输速度相对UDP较慢;
  • TCP连接只能是一对一的(端到端);UDP支持一对一、一对多、多对一和多对多的通信方式。

浏览器输入URL到页面返回详细过程

1 输入网址 输入要访问的网址,即URL
2 缓存解析 浏览器获取URL后,先去缓存中查找资源,从浏览器缓存-系统缓存-路由器缓存中查看; 如果有就从缓存中显示界面,不再发送请求; 如果没有,则发送http请求;
3 域名解析 发现缓存中没有资源,发送http请求; 在发送http请求之前,需要进行DNS解析(域名解析); DNS解析:域名到IP地址的转换过程,域名的解析工作由DNS服务器完成,解析后可以获取域名相应的IP地址;
4 tcp连接 三次握手在域名解析后,浏览器向服务器发起了http请求,tcp连接; 因为tcp协议时面向连接的,所以在传输数据前必须建立连接,即三次握手;tcp连接建立后,浏览器开始向服务器发送http请求报文
5 收到请求 服务器收到浏览器发送的请求信息,返回响应
6 页面渲染 浏览器收到服务器发送的响应,显示页面内容。

什么是Cookie和Session,二者区别

 什么是SQL注入

SQL注入就是将原本的SQL语句的逻辑结构改变,使得SQL语句的执行结果和原本开发者的意图不一样;
比如说我们通过账号密码进行登录,首先需要进行查询判断:
"select * from t_user where name = "张三" and password = "123456"
如果我们把or 1 = 1作为拼接在密码末尾传入进来,执行查询的时候sql会变成
"select * from t_user where name = "张三" and password = "123456" or 1 = 1
密码永远都是成立的,所以,前面无论密码正确与否都会成功登录
我们使用预编译语句就可以避免这个问题,例如:JDBC中的PrepareStatement或MyBatis中#{}
将sql预编译,传参数的时候,不会改变sql语句结构,就可以避免注入。
 

猜你喜欢

转载自blog.csdn.net/qq_52135683/article/details/133840788
今日推荐