Java进阶篇--网络编程

​​​​​​​

目录

计算机网络体系结构

什么是网络协议?

为什么要对网络协议分层?

网络通信协议

TCP/IP 协议族

应用层

运输层

网络层

数据链路层

物理层

TCP/IP 协议族

TCP的三次握手四次挥手

TCP报文的头部结构

三次握手

四次挥手

常见面试题

1、TCP为什么不是两次连接?而是三次握手?

2、tcp和udp的区别

3、流量控制和拥塞控制

4、流量控制和拥塞控制的实现机制

5、为什么TCP连接的时候是3次,关闭的时候却是4次?

6、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?

7、在子网210.27.48.21/30种有多少个可用地址?分别是什么?

8、在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障?

9、网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?

10、TCP的重发机制是怎么实现的?

11、Tcp流, udp的数据报,之间有什么区别,为什么TCP要叫做数据流?

12、流量控制与拥塞控制的区别,节点计算机怎样感知网络拥塞了???

13、TCP通讯中,select到读事件,但是读到的数据量是0,为什么,如何解决????

14、为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

15、如果已经建立了连接,但是客户端突然出现故障了怎么办?

16、什么是HTTP,HTTP 与 HTTPS 的区别

17、常用HTTP状态码

18、GET和POST区别

19、什么是对称加密与非对称加密

20、什么是HTTP2?

21、Session、Cookie和Token的主要区别?

22、如果客户端禁止 cookie 能实现 session 还能用吗?


计算机网络体系结构

计算机网络体系结构是指计算机网络中各个不同层次的协议和功能模块的组织结构。

什么是网络协议?

网络协议是计算机网络中用于通信和交换数据的规则和约定的集合。它定义了在网络中进行通信的各个实体(如计算机、服务器、路由器等)之间的消息格式、传输方式、错误处理和数据交换的顺序等规范。

网络协议确保了网络中的不同设备和系统能够按照统一的标准进行通信,使得数据的交换能够有条不紊地进行。通过遵循网络协议,不同计算机和设备可以在网络上进行有效的通信和数据交换。

具体而言,网络协议通常定义了以下几个方面:

  • 语法:规定了消息的格式和结构,即如何组织和表示数据。
  • 语义:定义了消息的含义和解释,确保通信双方对消息的理解是一致的。
  • 时序:规定了消息的发送和接收的顺序和时机,以及对消息的响应和超时处理。

网络协议可以分为不同的层次,每个层次负责处理特定的功能和任务。常见的网络协议族包括TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/英特网互联协议)、UDP协议(User Datagram Protocol,用户数据报协议)、ICMP协议(Internet Control Message Protocol,Internet 控制报文协议)、HTTP、FTP、SMTP等。其中,TCP/IP协议是互联网最基本和最重要的协议族,它定义了互联网通信的基本规则和机制。

总而言之,网络协议是为了确保计算机网络中的设备能够按照事先约定好的规则进行通信和数据交换的一套规范。它们是实现互联网等计算机网络的基础基石。

为什么要对网络协议分层?

网络协议被分层的主要目的是为了简化设计、实现和维护网络通信系统的复杂性。

以下是为什么要对网络协议进行分层的一些重要原因:

  • 简化问题:将网络协议拆分为多个层次可以将复杂的网络通信问题划分为更小、更易管理的子问题。每个层次专注于特定的功能,使得整个设计过程更加清晰和可控。
  • 模块化设计:通过分层,每个层次都有特定的任务和职责。这种模块化设计使得不同层次之间的功能独立,并且可以根据需要进行修改、替换或升级,而无需影响其他层次。这提高了系统的灵活性和可扩展性。
  • 简化实现:分层设计使得各种网络协议可以通过标准接口相互配合工作。这样一来,不同层次之间的开发者可以独立地实现自己的层次,并且只需要关注各自层次内部的逻辑,而不需要了解整个系统的细节。这简化了网络协议的实现过程,提高了开发效率。
  • 促进标准化:按照分层的设计,每个层次都可以定义相应的协议标准。这样一来,不同厂商和组织可以根据这些标准来设计和实现自己的产品和服务,从而实现互操作性。分层设计促进了网络协议的标准化工作,使得通信设备和软件能够在不同环境下相互兼容。

总之,通过将网络协议进行分层,可以简化问题难度、模块化设计、简化实现过程,并促进标准化工作。这种分层的设计思想被广泛应用于现代网络技术中,使得网络通信更加可靠、灵活和可扩展。

以下是一些与网络协议分层相关的潜在缺点:

  • 功能重叠:由于不同的协议层可能需要处理相似或重复的功能,因此可能会导致功能的重复实现和开销增加。这可能使系统变得复杂,并增加了资源的使用。

  • 性能影响:在多层协议堆栈中,每个层次的处理都需要额外的计算和通信开销。这些开销可能会对系统的性能产生影响,例如增加延迟、降低吞吐量或增加处理负担。

  • 系统复杂性:网络协议分层将网络通信问题分解为多个层次,但这也增加了系统的复杂性。不同的层次之间需要有清晰的接口和协作机制,以确保正确的数据传输和协议交互。复杂的系统架构和依赖关系可能增加了调试、故障排除和维护的难度。

  • 协议升级的挑战:当需要对网络协议进行升级或添加新功能时,必须考虑多个层次之间的兼容性和一致性。这可能需要对多个层次进行调整和升级,以确保整个系统的一致性和稳定性。

尽管网络协议分层存在一些缺点,但我们可以通过合理的设计和优化来减少其影响。实际上,分层设计提供了一种模块化和可扩展的方法来处理网络通信,使得系统更具灵活性、可维护性和互操作性。

网络通信协议

为了使不同体系结构的计算机网络都能互联,国际标准化组织 ISO 于1977年提出了一个试图使各种计算机在世界范围内互联成网的标准框架,即著名的开放系统互联基本参考模型 OSI/RM,简称为OSI。这个模型包含了七层协议体系结构,并试图实现不同计算机网络的互联。然而,尽管OSI模型在理论上较为完整和清晰,但由于其复杂性和较少的实际应用,它并没有得到广泛的采用。

相比之下,TCP/IP体系结构具有更加简洁和实用的特点,因此在实际中得到了广泛应用。TCP/IP包含四层协议:应用层、运输层、网际层和网络接口层。其中,网络接口层强调了解决不同网络互连的问题,但它的具体内容相对较少。因此,在学习计算机网络原理时,常常采用综合OSI和TCP/IP优点的方式,采用只有五层协议的体系结构。有时,也可以将最底下的两层称为网络接口层,以方便理解和描述。

总的来说,尽管OSI模型在理论上较为完善,但TCP/IP体系结构由于其简洁和实用性,已成为当前广泛应用的网络协议体系结构。

Java进阶篇--网络编程_第1张图片

四层协议(TCP/IP协议):

  1. 应用层:提供应用程序之间的通信和数据交换,例如HTTP、FTP、SMTP等协议。
  2. 运输层:确保端到端的数据传输,提供可靠的数据传输和错误恢复,例如TCP、UDP协议。
  3. 网络层:处理网络间的数据路由和转发,负责数据包的寻址和选择最佳路径,例如IP协议。
  4. 数据链路层:负责将数据帧从一个物理节点传输到相邻的物理节点,通过物理地址进行传输,例如以太网、Wi-Fi等。

五层协议(五层体系结构):

  1. 应用层:提供应用程序之间的通信和数据交换,与四层体系结构的应用层相同。
  2. 运输层:确保端到端的数据传输,提供可靠的数据传输和错误恢复,与四层体系结构的运输层相同。
  3. 网络层:处理网络间的数据路由和转发,负责数据包的寻址和选择最佳路径,与四层体系结构的网络层相同。
  4. 数据链路层:负责将数据帧从一个物理节点传输到相邻的物理节点,通过物理地址进行传输,与四层体系结构的数据链路层相同。
  5. 物理层:负责传输介质和物理信号传输,例如电缆、光纤等。

七层协议模型(OSI模型):

  1. 应用层:提供用户与网络之间的接口,实现用户的应用程序与网络的通信,例如HTTP、FTP、SMTP等协议。
  2. 表示层:处理数据表示、加密和压缩等,确保应用程序之间的交互能够正确解释数据的含义。
  3. 会话层:管理不同应用程序之间的对话和会话,确保数据传输的顺序和完整性。
  4. 运输层:确保端到端的数据传输,提供可靠的数据传输和错误恢复,例如TCP、UDP协议。
  5. 网络层:处理网络间的数据路由和转发,负责数据包的寻址和选择最佳路径,例如IP协议。
  6. 数据链路层:负责将数据帧从一个物理节点传输到相邻的物理节点,通过物理地址进行传输,例如以太网、Wi-Fi等。
  7. 物理层:负责传输介质和物理信号传输,例如电缆、光纤等。

这些协议体系结构和模型旨在提供一种规范和标准化的方式,以确保不同计算机网络之间的互操作性和通信能力。

需要注意的是,五层协议体系结构只是为了网络原理的教学和概念阐述而设计,而实际应用中仍然基于TCP/IP的四层体系结构。

TCP/IP 协议族

应用层

应用层是TCP/IP协议栈中的最高层,它负责通过应用进程间的交互来完成特定的网络应用。应用层协议定义了应用进程之间通信和交互的规则。

在互联网中,有许多不同的应用层协议被广泛使用。下面列举一些常见的应用层协议及其功能:

  • 域名系统(DNS):用于将域名转换为对应的IP地址,实现主机名到IP地址的映射。
  • 超文本传输协议(HTTP):用于支持万维网应用,实现浏览器和Web服务器之间的通信,包括发送请求和获取响应。
  • 文件传输协议(FTP):用于在客户端和服务器之间传输文件。
  • 电子邮件传输协议(SMTP):用于发送和接收电子邮件。
  • 简单邮件传输协议(POP3):用于从邮件服务器上下载电子邮件。
  • 网络新闻传输协议(NNTP):用于获取和发布新闻文章。
  • 动态主机配置协议(DHCP):用于动态分配IP地址给网络中的设备。
  • 基于位置的服务协议(LBS):用于提供基于设备所在位置的服务,如地图导航、位置分享等。
  • 远程登录协议(SSH、Telnet):用于远程登录到其他计算机,并在远程终端上执行命令和操作。
  • 互联网电子邮件访问协议(IMAP):用于管理邮件服务器上的电子邮件,包括收取、保存、删除等操作。

以上只是部分常见的应用层协议,每个协议都有不同的功能和特点,适用于不同的应用场景。这些协议通过定义通信规则,使得不同的应用程序能够在互联网上进行通信和交互。

运输层

运输层(Transport Layer)主要负责为应用层提供可靠的数据传输服务。运输层使用传输协议(如TCP和UDP)来实现数据的分段、传输、重组和错误检测等功能。

  • TCP协议(Transmission Control Protocol)是一种面向连接的可靠传输协议。它通过建立端到端的连接,在通信双方之间提供可靠的数据传输。TCP使用流量控制、拥塞控制、确认应答和重传机制等方法来确保数据的可靠性和无差错性。TCP适用于对数据传输可靠性要求较高的应用场景,如文件传输、电子邮件等。
  • UDP协议(User Datagram Protocol)是一种无连接的不可靠传输协议。它将数据分割成小的数据报并进行传输,但不提供任何形式的确认机制和重传机制。UDP更加简单快速,适用于对实时性要求较高、但对数据传输可靠性要求较低的应用场景,如音频、视频流传输等。

运输层协议根据具体应用的需求选择使用TCP或UDP。

一些常见的基于TCP的协议有

  • HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
  • HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。
  • FTP(File Transfer Protocol,文件传输协议),用于文件传输。
  • POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
  • SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
  • TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
  • SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。

而一些基于UDP的协议有

  • BOOTP(Boot Protocol,启动协议),应用于无盘设备。
  • NTP(Network Time Protocol,网络时间协议),用于网络同步。
  • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。

同时,还有一些协议同时支持TCP和UDP,如

  • DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作。

总之,运输层负责为应用层提供可靠的数据传输服务,并根据应用的需求选择适当的传输协议,以实现高效、可靠的数据通信。

网络层

网络层(Network Layer)主要负责选择适当的路由和交换节点,以确保计算机之间的数据能够及时传输。在发送数据时,网络层会将运输层生成的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系结构中,由于网络层采用IP协议,因此这些分组也被称为IP数据报或简称为数据报。

互联网是由许多不同类型的网络通过路由器相互连接而成的。在互联网中,网络层使用无连接的网际协议(IP)作为主要的网络层协议,并结合使用多种路由选择协议。因此,互联网的网络层也被称为网际层或IP层。

网络层的任务主要包括:

  1. 路由选择:根据网络拓扑和路由表,决定将数据从源地址发送到目的地址的最佳路径。
  2. 分组和封装:将来自上层的数据划分为合适的大小,并封装成数据分组或包进行传输。
  3. 数据转发:根据目的地址,将数据分组或包转发到下一个网络节点,直到达到目的主机。

网络层依赖IP协议来实现数据报中的源地址和目的地址传递,以便将数据从源主机传输到目的主机。网络层本身并不处理数据的可靠性和错误校验,这些功能通常由传输层和数据链路层来实现。

总之,网络层在计算机网络中扮演着重要角色,它负责实现计算机之间的通信和数据传输。通过选择合适的路由和交换节点,网络层确保数据在不同网络之间高效传输。在互联网中,网络层采用IP协议作为核心协议,并与多种路由选择协议相结合,实现数据的顺利传输。

数据链路层

数据链路层(data link layer)通常简称为链路层。主要负责在两个相邻节点之间传输数据。在数据传输过程中,数据链路层将网络层提供的IP数据报组装成帧,并在相邻节点之间的链路上传送这些帧。每个帧包括数据以及必要的控制信息(如同步信息、地址信息、差错控制等)。

通过数据链路层,发送端能够将数据按照一定的格式进行传输,并在接收端可靠地解析和还原数据。帧中的控制信息可以告知接收端一个帧的起始和结束位置。

在常见的Web应用通信传输中,数据经过不同层级的传输流程如下:

Java进阶篇--网络编程_第2张图片

  • 发送端在层与层之间传输数据时,每经过一层都会添加一个该层的首部信息。这样层层相叠加,直到数据链路层。
  • 在数据链路层,数据被组装成帧并添加控制信息后,通过物理链路传输。
  • 接收端在接收数据时,会依次通过各层,每经过一层都会去除对应的首部信息,最终将数据传递给应用层。

数据链路层的工作主要包括封装成帧、传输控制、差错检测和纠正等。它通过将数据分割为帧,添加控制信息来保障数据的可靠传输,并在接收端进行解析和处理。同时,数据链路层也负责链路的同步和差错控制,以确保数据的准确性和完整性。

数据链路层的任务包括:

  1. 封装成帧:将网络层提供的IP数据报封装成帧,并添加控制信息。
  2. 帧的传输:在相邻节点之间传输帧。
  3. 错误检测与纠正:通过差错控制等机制,检测并纠正传输过程中可能出现的错误。

总之,数据链路层在计算机网络中负责相邻节点之间的数据传输。数据链路层起到了将网络层的数据交付到物理层的作用,通过封装成帧和控制信息,数据链路层保证数据在链路上的可靠传输。同时,数据链路层也负责错误检测与纠正,确保数据传输的准确性。

物理层

物理层(Physical Layer)是计算机网络体系结构中最底层的一层,它负责在网络中传输比特流,将数据从发送端传输到接收端。物理层上所传送的数据单位是比特。

物理层的主要作用是实现相邻计算机节点之间比特流的透明传送,屏蔽掉具体传输介质和物理设备的差异。它将上层的数据转换为电信号,并通过物理媒介(如电缆、光纤等)进行传输。物理层的目标是确保比特流在传输过程中没有发生变化,使得上层的数据链路层不需要考虑具体的传输介质。

在物理层中,常见的任务包括编码、调制、传输介质的选择和定界、时钟同步、传输速率控制等。物理层负责将比特流转换为可以在物理媒介上传输的模拟信号或数字信号,并进行必要的信号调整和处理,以确保数据能够准确可靠地传输。

总之,物理层在计算机网络中起到了将数据从发送端传输到接收端的作用。它屏蔽了具体的传输介质和物理设备差异,通过将数据转换为比特流并进行透明传送,确保数据能够在网络中准确地传输。

TCP/IP 协议族

TCP/IP协议族是互联网通信中最重要和著名的一组协议。虽然人们通常将TCP/IP指代为指TCP和IP这两个具体的协议,但实际上它涵盖了互联网所使用的整个协议家族。

Java进阶篇--网络编程_第3张图片

互联网协议套件(Internet Protocol Suite,缩写IPS)是一个网络通信模型和传输协议家族,构成了网际网络的基础通信架构。它常被称为TCP/IP协议族(TCP/IP Protocol Suite或TCP/IP Protocols),简称TCP/IP。这个名字是因为TCP(Transmission Control Protocol,传输控制协议)和IP(Internet Protocol,网际协议)这两个核心协议是该协议家族中最早定义并通过的标准。

要点总结:

  • TCP(传输控制协议)和IP(网际协议)是TCP/IP协议族中最先定义的两个核心协议,因此整个协议族以它们来命名。

TCP/IP协议族在互联网中起着至关重要的作用。它定义了数据在网络中的传输方式和规则,为互联网通信提供了基本框架。无论是网页浏览、电子邮件、文件传输还是实时通信,都依赖于TCP/IP协议族的支持。

TCP的三次握手四次挥手

TCP是一种面向连接、可靠的、基于字节流的传输层通信协议,它通过三次握手建立连接,并通过四次挥手关闭连接。TCP在传输数据之前,需要在通信双方之间建立连接,保存对方的信息,并交换一些连接参数,这些参数通常包含在TCP头部中。一个TCP连接由四个要素构成,即两个IP地址和两个端口号。

TCP通过使用序列号和确认应答机制,可以检测和纠正数据传输中的丢失、重复或错误。这使得TCP在不可靠的网络环境下能够提供可靠的数据传输。最后,当建立或终止连接时,TCP使用的报文段中可能只包含TCP头部而没有数据载荷。

TCP报文的头部结构

在了解TCP连接之前先来了解一下TCP报文的头部结构。

Java进阶篇--网络编程_第4张图片

  • 序号(Sequence Number):占32位,用于标识从TCP源端向目的端发送的字节流的序号。发送方在发送数据时使用该字段进行标记。

  • 确认序号(Acknowledgment Number):占32位,仅当ACK标志位为1时有效。确认序号表示接收方期望收到的下一个字节的序号,即ack = seq + 1。

  • 标志位(Flags):共6个标志位,分别是URG、ACK、PSH、RST、SYN、FIN。

    1. ACK(Acknowledgment):确认序号有效。
    2. FIN(Finish):释放一个连接。
    3. PSH(Push):接收方应该立即将该报文交给应用层处理。
    4. RST(Reset):重置连接。
    5. SYN(Synchronize):发起一个新连接。
    6. URG(Urgent):紧急指针有效。

需要注意的是:

  • 不要混淆确认序号ack与标志位中的ACK。
  • 确认方的ack值等于发起方的seq值加1,这两个字段在两端进行配对。

这些字段组成了TCP报文头部的一部分,通过这些字段,TCP协议可以提供可靠的、面向连接的数据传输服务。

三次握手

Java进阶篇--网络编程_第5张图片

  • 第一步:客户端发送一个带有SYN(同步)标志位的报文段给服务器,并选择一个随机的序列号(Seq)作为起始序号,此时客户端进入SYN_SENT状态。
  • 第二步:服务器接收到客户端的请求后,回复一个带有SYN/ACK标志位的报文段作为响应。在该报文段中,确认序号(Ack)设置为客户端的序列号加1,同时服务器也选择一个随机的序列号作为起始序号。此时服务器进入SYN_RECEIVED状态。
  • 第三步:客户端接收到服务器的响应后,发送一个带有ACK标志位的报文段作为确认。在该报文段中,确认序号设置为服务器的序列号加1。此时,客户端和服务器都进入已建立连接的ESTABLISHED状态,可以进行数据传输。 

四次挥手

Java进阶篇--网络编程_第6张图片

  • 第一步:当客户端或服务器决定关闭连接时,发送一个带有FIN(结束)标志位的报文段给对方。发起关闭方进入FIN_WAIT_1状态。
  • 第二步:接收到关闭方的FIN报文段后,另一方发送一个带有ACK标志位的报文段作为确认,并确认收到的序号(Ack)设置为发起关闭方的序列号加1。此时,发起关闭方进入FIN_WAIT_2状态。
  • 第三步:当另一方准备关闭连接时,会发送一个带有FIN标志位的报文段给发起关闭方。另一方进入LAST_ACK状态。
  • 第四步:发起关闭方接收到另一方的FIN报文段后,发送一个带有ACK标志位的报文段作为确认,并将确认序号设置为另一方的序列号加1。此时,发起关闭方进入TIME_WAIT状态。当另一方收到确认后,也进入CLOSED状态。

通过这样的握手和挥手过程,TCP可以可靠地建立和关闭连接,确保数据的可靠传输。

常见面试题

1、TCP为什么不是两次连接?而是三次握手?

假设只进行两次握手:

  1. A向B发送一个连接请求报文段。
  2. B接收到连接请求后,向A发送一个连接确认报文段(ACK)。
  3. A收到B的连接确认报文段后,建立起连接。

但在这种情况下,如果该连接请求报文段在网络中滞留时间过长,超过了某个较长的时间阈值,A就会认为这个连接已经失效,于是关闭这个连接。然而,由于网络延迟,B在较长时间后才收到A的连接请求。B此时认为是一个新的连接请求,于是向A发送连接确认报文段。

这样,由于A已经关闭了之前的连接,而B并不知道,B就会一直等待A发送的数据,而A对于B的连接确认报文段并不会做出任何响应,也不会发送数据。这种情况下,B会一直等待,造成资源的浪费和僵局。

通过引入第三次握手,可以避免上述的问题:

  1. A向B发送连接请求报文段。
  2. B接收到连接请求后,向A发送连接确认报文段(ACK)。
  3. A收到B的连接确认报文段后,再次向B发送确认报文段(ACK)。
  4. B收到A的确认报文段后,连接建立完毕。

这样,当A关闭连接后,即使B在较长时间后收到A发送的连接请求报文段,B也能够通过第三次握手中的确认报文段得知这是一个失效的连接请求,而不会误认为是一个新的连接请求。

因此,通过三次握手可以确保双方都能够正确地建立连接,避免资源浪费和僵局的发生。

2、tcp和udp的区别

  • TCP(传输控制协议)是面向连接的协议,而UDP(用户数据报协议)是无连接的协议。TCP需要在通信双方建立连接后才能进行数据传输,而UDP不需要建立连接,可以直接发送数据包。
  • TCP提供可靠的数据传输,保证数据的完整性、顺序性和不重复性。它使用确认机制、重传机制和序列号来确保数据的可靠传输。UDP不提供可靠性保证,数据包的传输可能会丢失、乱序或重复。
  • TCP是面向字节流的传输,它将应用程序交给它的数据看作是一个字符流,分割成以字节为单位的数据段进行传输。UDP是面向数据报的传输,每个数据包都是相互独立的,具有独立的地址和端口信息。
  • TCP具有拥塞控制和流量控制机制,可以根据网络的状态动态调整传输速率,防止网络拥塞。UDP没有拥塞控制和流量控制机制,数据包会尽可能快地发送出去,但可能会导致网络拥塞。

总结起来,TCP是可靠、有序、面向连接的传输协议,适用于要求数据完整性和顺序性的应用;UDP是不可靠、无序、无连接的传输协议,适用于对实时性要求较高的应用。

3、流量控制和拥塞控制

拥塞控制 --- 网络拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。

流量控制 --- 数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制,以免数据丢失。流量控制用于防止在端口阻塞的情况下丢帧,这种方法是当发送或接收缓冲区开始溢出时通过将阻塞信号发送回源地址实现的。流量控制可以有效的防止由于网络中瞬间的大量数据对网络带来的冲击,保证用户网络高效而稳定的运行。

4、流量控制和拥塞控制的实现机制

1、TCP采用大小可变的滑动窗口机制实现流量控制功能。窗口的大小是字节。在TCP报文段首部的窗口字段写入的数值就是当前给对方设置发送窗口的数据的上限。
在数据传输过程中,TCP提供了一种基于滑动窗口协议的流量控制机制,用接收端接收能力(缓冲区的容量)的大小来控制发送端发送的数据量。

2、采用滑动窗口机制还可对网络进行拥塞控制,将网络中的分组(TCP报文段作为其数据部分)数量维持在一定的数量之下,当超过该数值时,网络的性能会急剧恶化。传输层的拥塞控制有以下四种算法。

  • 慢开始(Slow Start):发送方初始时以一个较小的拥塞窗口发送数据,并随着接收到的确认逐渐增加拥塞窗口的大小。这样可以防止一开始就发送过多的数据导致网络拥塞。
  • 拥塞避免(Congestion Avoidance):发送方根据网络的拥塞程度来调整拥塞窗口的大小。当网络拥塞时,发送方降低拥塞窗口的增长速率,以减少数据的发送速率,从而缓解网络负载。
  • 快重传(Fast Retransmit):接收方在连续收到相同的重复确认时,会立即重传丢失的报文段,而不必等待超时时间到达。这样可以更快地恢复丢失的数据,减少网络拥塞带来的影响。
  • 快恢复(Fast Recovery):当发送方接收到连续的重复确认时,快恢复机制允许发送方将拥塞窗口减半,并进入拥塞避免状态,而不是回退到慢开始状态。这样可以更快地从拥塞状态中恢复。

拥塞:大量数据报涌入同一交换节点(如路由器),导致该节点资源耗尽而必须丢弃后面到达的数据报时,就是拥塞。

5、为什么TCP连接的时候是3次,关闭的时候却是4次?

TCP连接的建立和关闭时序中,确实存在建立时3次握手,关闭时4次挥手的差异,原因如下:

  • 三次握手建立连接:建立TCP连接时,客户端发送SYN(同步)报文给服务器,服务器收到后回复SYN+ACK(同步确认)报文给客户端,最后客户端再发送ACK(确认)报文给服务器。这样,就建立了双向的连接。
  • 四次挥手关闭连接:关闭TCP连接时,一方(假设为客户端)发送FIN(结束)报文给对方(假设为服务器),对方收到后会回复ACK报文确认收到。然后,对方发送FIN报文给客户端,客户端收到后回复ACK报文确认收到。最终,连接关闭。

这里需要注意的是,关闭连接时,由于TCP是全双工的协议,双方各自可以单独关闭连接。因此,四次挥手过程中,每一方都要发送一个FIN报文,以确保两端的连接都能正常关闭。

总结起来,建立连接使用三次握手,是为了确保双方都能正确地建立连接;关闭连接使用四次挥手,是为了让双方都有机会发送FIN报文并进行连接的正常关闭。

6、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?

在TCP/IP网络中,服务器端无法直接收到客户端掉线或重启的通知。TCP协议本身并没有提供一种机制来实时通知服务器端客户端的状态变化。

当客户端突然掉线或重启时,服务器端将不会立即收到复位信号。相反,服务器端会在一段时间内继续保持与客户端的连接,并尝试向客户端发送数据或心跳包来验证连接是否仍然有效。如果服务器在一定时间内未能收到客户端的响应,就会判断客户端已经断开连接。

默认情况下,操作系统会设置一个TCP超时时间,称为Keep-Alive Time,用于确认连接的状态。当超过该时间后,服务器会认为客户端已经掉线或重启。

要更快地检测到客户端的掉线或重启,一种常见的方法是应用层心跳机制。服务器端和客户端可以定期交换心跳包,以确认彼此的活动状态。如果服务器在一定时间内未能收到客户端的心跳回复,就可以假设客户端已经掉线或重启。

需要注意的是,这种心跳机制需要在应用层上进行实现,并且需要服务器端和客户端双方的支持。具体实现方式和可行性取决于应用程序的设计和开发。

7、在子网210.27.48.21/30种有多少个可用地址?分别是什么?

根据CIDR表示法中的规则,/30网络掩码有4个可用地址:网络地址、第一个可用的主机地址、第二个可用的主机地址和广播地址。

在子网210.27.48.21/30中,可用的地址如下:

  • 网络地址:210.27.48.20
  • 第一个可用的主机地址:210.27.48.21
  • 第二个可用的主机地址:210.27.48.22
  • 广播地址:210.27.48.23

8、在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障?

要测试主机A和主机B之间的连通性,可以使用以下方法:

  • 使用ping命令:在一台主机上运行ping命令,并指定另一台主机的IP地址作为目标。如果ping命令成功返回响应,说明两台主机之间是连通的。
  • 使用traceroute或tracert命令:在一台主机上运行traceroute命令(在Linux系统下)或tracert命令(在Windows系统下),并指定另一台主机的IP地址作为目标。这将显示从源主机到目标主机之间经过的路由器或交换设备的跳数。如果显示的跳数不超过期望值,并且最终到达目标主机,则说明两台主机之间是连通的。如果在某个跳点上没有响应,可能存在故障点。

如果测试发现两台主机之间不连通,可以尝试以下步骤来判断故障点和排除故障:

  1. 检查网络连接:确保主机A和主机B的物理连接正常,包括检查网线是否插好、端口是否正确连接等。
  2. 检查IP地址和子网掩码设置:确定主机A和主机B的IP地址和子网掩码设置正确,并且位于同一个子网中。
  3. 检查网络设备:检查路由器、交换机或其他中间设备的状态,确保它们正常工作且配置正确。检查设备的接口状态、配置是否正确等。
  4. 检查防火墙设置:如果主机A或主机B上启用了防火墙,确保防火墙规则允许通信。
  5. 进行连通性测试:在主机A和主机B之间进行更详细的连通性测试,例如使用端口扫描工具来测试特定端口的连通性。这将有助于更精确定位故障点。
  6. 使用traceroute命令定位故障点:在主机A上运行traceroute命令,指定主机B的IP地址作为目标,确定两台主机之间的路径。根据traceroute的输出,找到没有响应的跳点,从而确定可能出现问题的路由器或交换设备。
  7. 排除故障:根据定位到的故障点,逐步检查和排除可能的问题。可以尝试重新启动故障设备、检查设备配置、检查电缆连接等。

9、网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?

答案一:

  • 进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
  • 线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

答案二:
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:

  • 速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
  • 资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
  • 同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。

10、TCP的重发机制是怎么实现的?

TCP的重发机制主要通过滑动窗口和选择性重传来实现。下面是详细的说明:

1. 滑动窗口机制:
   滑动窗口是TCP用于管理发送方和接收方之间的数据流的机制。发送方维护一个发送窗口,表示可以发送的数据的范围。接收方维护一个接收窗口,表示可以接收的数据的范围。

  • 发送窗口:发送方根据接收方的反馈情况来调整发送窗口的大小。发送窗口的边界标志了已确认(已被接收方确认接收)的数据范围,发送方只能发送发送窗口内的数据。
  • 接收窗口:接收方根据自身处理能力来调整接收窗口的大小。接收窗口的边界标志了已成功接收的数据范围,接收方只能接收接收窗口内的数据。

   滑动窗口机制的作用是确保发送方和接收方之间的数据量适当,防止发送方过快发送导致接收方无法及时处理,或接收方处理速度过慢导致发送方长时间等待确认。

2. 选择性重传:
   选择性重传是TCP用于对传输出错的数据进行重传的机制。当发送方发出一批数据后,这些数据会依次被编号。接收方将已成功接收到且连续的数据进行确认,未成功接收或丢失的数据则不进行确认。发送方通过未收到确认的数据编号来确定哪些数据需要进行重传。

   选择性重传能够减少重传的数据量,提高传输效率。只有发生数据丢失的情况下才进行重传,而已经成功接收的数据不会重复传输。

通过滑动窗口机制和选择性重传,TCP能够实现可靠的数据传输。发送方根据接收方的反馈信息调整发送窗口的大小,确保发送速度和接收能力的匹配。同时,选择性重传机制能够帮助发送方快速恢复因传输错误导致的数据丢失,提高数据传输的可靠性和完整性。

11、Tcp流, udp的数据报,之间有什么区别,为什么TCP要叫做数据流?

TCP和UDP之间的主要区别如下:

连接性:

  • TCP是面向连接的协议,通信双方在传输数据之前需要先建立连接。连接的建立需要进行握手过程,建立一条可靠的通信路径。数据在这条连接上进行传输,可以是双向的,并且没有明确的边界。
  • UDP是无连接的协议,通信双方之间不需要建立连接。每个UDP数据报都是独立的包,具有自己的目标地址和源地址,之间没有先后顺序的要求。

可靠性:

  • TCP提供可靠的数据传输机制。它使用确认、重传和序列号等机制来保证数据的可靠传输。如果发生数据丢失或损坏,TCP会重新发送数据,直到接收方正确接收到数据。
  • UDP不提供可靠性保证,它以尽最大努力交付的方式进行传输。UDP不进行确认和重传,如果在传输过程中发生丢包,则丢失的数据将不会被恢复。

数据流与数据报:

  • TCP被称为数据流协议是因为它提供了一种基于字节流的数据传输方式。TCP将应用层传递给它的数据划分成以字节为单位的数据流,并保证这些字节按照顺序传输到接收方。
  • UDP使用数据报方式进行传输。每个UDP数据报都是独立的,具有自己的报头和数据部分,之间有边界。

资源占用:

  • 由于TCP需要建立连接、维护状态等额外的操作,它的资源占用相对较高。TCP占用的系统资源较多,性能较UDP略低。
  • UDP不需要建立连接,没有握手和状态维护等开销,因此它的资源占用较低,传输效率较高。

综上所述,TCP和UDP在连接性、可靠性、数据传输方式和资源占用等方面存在明显的区别。TCP提供了可靠的、面向连接的、基于字节流的数据传输,适用于对数据完整性要求高的场景。而UDP是无连接的、不可靠的、基于数据报的数据传输,适用于实时性要求高、对数据丢失不敏感的场景。

12、流量控制与拥塞控制的区别,节点计算机怎样感知网络拥塞了???

流量控制和拥塞控制是TCP协议中用于维护网络性能和避免网络拥塞的两种机制。

流量控制:

  • 目的:流量控制主要是确保接收方能够处理发送方发送的数据,防止接收方因为来不及处理而丢失数据。
  • 实现方式:TCP使用滑动窗口机制实现流量控制。接收方通过在TCP报文段的确认中指定可接收的数据量,发送方根据这个信息调整发送速率,保证发送的数据不会超过接收方的处理能力。

拥塞控制:

  • 目的:拥塞控制主要是为了避免网络拥塞,当网络中的流量过大超过网络的承载能力时,拥塞控制机制会调整发送方的发送速率,以降低网络拥塞的程度,保证各个参与通信的节点都能正常运行。
  • 实现方式:TCP使用拥塞窗口、慢启动、拥塞避免和快速重传等机制来实现拥塞控制。它通过不断地监测网络的拥塞情况,根据拥塞窗口的大小来调整发送速率,以避免过多的数据拥塞,减少数据丢失的可能性。

节点计算机感知网络拥塞的方式有多种,以下是几个常见的方式:

  1. 丢包率:节点可以通过监测传输过程中发生的数据包丢失情况来判断网络是否拥塞。当网络发生拥塞时,由于网络资源有限,会导致数据包丢失的概率增加。
  2. 延迟增加:网络拥塞会导致数据在传输过程中出现较大的延迟。节点可以通过测量数据传输的延迟,当延迟显著增加时,可以判断网络存在拥塞。
  3. 队列长度:在网络设备(如路由器)中,数据包在传输之前通常会进入队列等待处理。节点可以通过监测队列的长度来判断网络是否拥塞。当队列长度超过一定阈值时,可能表示网络存在拥塞。

节点计算机可以结合以上这些方式来感知网络的拥塞状况。一旦节点计算机感知到网络拥塞,TCP协议会使用拥塞控制机制进行相应的调整,例如降低发送速率、减小拥塞窗口等方式,以减少网络拥塞的程度,保证数据的正常传输和网络性能的稳定。

13、TCP通讯中,select到读事件,但是读到的数据量是0,为什么,如何解决????

当使用select函数进行多路复用时,如果select返回读事件,但实际读取的数据量为0,通常表示对方已经关闭了socket的读端。在这种情况下,解决方法是关闭本端的读端,即调用close或shutdown函数关闭连接的读端。

另外,当select函数出错时,会将接口置为可读又可写。此时需要判断select的返回值是否为-1来区分读事件和错误事件。如果select返回-1,表示发生了错误。对于错误事件,需要进行相应的错误处理,例如关闭连接,重新连接或其他操作,具体处理方式取决于你的应用需求和设计。

总结起来,当select到读事件但读取数据量为0时,需要关闭本端的读端;而当select返回-1时,则需要进行错误处理,根据具体情况采取适当的措施,例如关闭连接、重新连接等。

14、为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

在TCP的四次挥手过程中,客户端发出第四次挥手的确认报文后要等待2MSL(Maximum Segment Lifetime)的时间是为了确保服务端已经收到了该确认报文。

当客户端发送第四次挥手的确认报文后,如果报文丢失,服务端将无法收到确认,并会重新发送第三次挥手的报文。此时,客户端需要等待一段时间,以确保可能重传的第三次挥手报文被服务端接收到并成功处理。而这个时间就是2MSL的值。

2MSL的值是根据网络环境和数据包存活时间来确定的,它是报文最长的生命周期。在这段时间内,可以确保网络中的所有延迟或重排的报文都被丢弃,避免旧的报文与新的连接混淆。

因此,在客户端发出第四次挥手的确认报文后,等待2MSL的时间可以确保服务端收到了该确认,并且避免旧的报文对新连接产生影响。这样可以安全地释放TCP连接并进行后续的操作。

15、如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP有一个保活计时器,用于检测客户端是否处于故障状态。服务器在接收到客户端的请求后,会重置该计时器,并将其设置为一个固定的时间间隔(通常为2小时)。如果在这个时间间隔内没有收到来自客户端的任何数据,服务器将发送一个探测报文段给客户端。探测报文段的发送间隔通常为75秒,服务器会连续发送多个探测报文段。如果连续发送10个探测报文段后仍然没有收到客户端的响应,服务器就会认为客户端已经发生故障,并关闭连接,释放相关资源。

这个保活机制确实是为了避免服务器一直等待不活跃的客户端而浪费资源。通过定期发送探测报文段,服务器可以及时检测到客户端的状态,避免持续等待无效连接。

16、什么是HTTP,HTTP 与 HTTPS 的区别

HTTP(Hypertext Transfer Protocol)是一种用于在Web上进行数据通信的协议。它定义了客户端和服务器之间进行请求和响应的规则和格式。HTTP使用TCP作为传输层协议,在Web浏览器和Web服务器之间传输HTML、图像、音频、视频等各种类型的数据。

HTTPS(Hypertext Transfer Protocol Secure)是HTTP的安全版本。它通过使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议,将传输过程中的数据进行加密和身份验证,以提供更高的安全性。

区别如下:

  1. 安全性:HTTP不对数据进行加密,数据传输是明文的,因此存在被窃听和篡改的风险;而HTTPS使用SSL/TLS加密传输数据,能够保护数据的隐私和完整性。
  2. 使用端口:HTTP使用的默认端口是80,而HTTPS使用的默认端口是443。这样,服务器可以通过端口号来区分是使用HTTP还是HTTPS协议。
  3. 证书:使用HTTPS的网站需要获得一个数字证书,该证书由受信任的证书颁发机构(CA)签发。该证书用于验证网站的身份,并确保与之通信的加密连接的安全性。而HTTP不需要证书验证。
  4. 连接方式:HTTP是无状态的,每个请求都是独立的,服务器不会保留任何关于请求的状态信息;而HTTPS通过使用SSL/TLS协议,可以建立持久的安全连接,服务器可以保留会话状态,提供更多的功能和安全性。

总结起来,HTTP是一种普通的、非加密的传输协议,适用于对数据传输安全性要求不高的场景;而HTTPS通过使用SSL/TLS加密传输数据,保证了数据的隐私和完整性,适用于对安全性要求较高的场景,如网上银行、电子商务等。

17、常用HTTP状态码

HTTP状态码是指当客户端向服务器发送请求时,服务器返回的一个3位数字代码。这个代码表示了当前HTTP请求的处理状态。

以下是常见的HTTP状态码列表:

1xx(信息性状态码):表示服务器接收到请求正在处理中。

  • 100 Continue:表示服务器已经接收到请求头,并且客户端应该继续发送请求体;
  • 101 Switching Protocols:表示服务器已经理解了客户端发送的升级协议的请求,并将通过Upgrade消息头通知客户端切换协议。

2xx(成功状态码):表示服务器已经成功地接收到请求和处理请求。

  • 200 OK:表示请求已成功完成,服务器返回的数据在响应体中;
  • 201 Created:表示请求已经被成功处理,并且服务器创建了一个新的资源;
  • 202 Accepted:表示服务器已接收到请求,但还没有处理完成;
  • 204 No Content:表示请求已成功处理,但是响应报文不包含实体的主体部分;
  • 206 Partial Content:进行范围请求成功

3xx(重定向状态码):表示需要客户端进一步进行操作才能完成请求。

  • 301 Moved Permanently:表示被请求的资源已被永久移动到新URI;
  • 302 Found:表示被请求的资源已经被临时移动到新URI;
  • 303 See Other:表示被请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源;
  • 304 Not Modified:表示客户端请求资源未被修改,可使用缓存的版本;
  • 307 temporary redirect:临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求

4xx(客户端错误状态码):表示客户端请求存在错误或不可完成。

  • 400 Bad Request:表示客户端请求有语法错误,服务器无法识别;
  • 401 Unauthorized:表示请求未经授权,需要身份验证;
  • 403 Forbidden:表示服务器拒绝请求,权限不足;
  • 404 Not Found:表示请求的资源不存在;

5xx(服务器错误状态码):表示服务器处理请求出现错误。

  • 500 Internal Server Error:表示服务器处理请求时发生了错误;
  • 501 Not Implemented:表示服务器不支持当前请求所需要的某个功能;
  • 503 Service Unavailable:表示服务器暂时无法处理请求,一般为临时性状况,稍后可恢复正常。

18、GET和POST区别

说到GET和POST,就不得不提HTTP协议,因为浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。

HTTP全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。HTTP的工作方式是客户端与服务器之间的请求-应答协议。

HTTP协议中定义了浏览器和服务器进行交互的不同方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删。

  • GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
  • POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
  • PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增。
  • DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。

GET和POST方法之间的区别:

  1. 安全性:GET请求将数据附加在URL中,因此数据对用户可见,这使得GET请求相对不安全。而POST请求将数据放在请求体中,对用户不可见,因此相对更安全。
  2. 数据长度限制:GET请求的URL长度通常受到限制(一般为2048字节),而POST请求没有固定的限制。
  3. 数据类型:GET请求只支持ASCII字符集,而POST请求支持整个ISO10646字符集,因此可以处理更多种类的数据。
  4. 执行效率:由于GET请求将所有数据附加在URL中,只需一个TCP数据包进行传输,因此执行效率较高。而POST请求需要先发送请求头部,再发送请求体,因此需要两个TCP数据包,效率稍低。

需要注意的是,根据HTTP协议的规范,并没有强制要求GET只能通过URL传递数据,也可以使用请求体来传递,而POST也可以通过URL参数传递数据。然而,按照常见的使用方式,GET通常用于获取数据,而POST用于提交数据。

19、什么是对称加密与非对称加密

对称加密和非对称加密是两种常见的加密算法。

  • 对称加密: 对称加密使用同一个密钥(也称为对称密钥)来进行加密和解密。发送方使用密钥将明文加密成密文,接收方使用相同的密钥将密文解密为明文。由于加密和解密使用相同的密钥,所以对称加密算法通常具有快速加密和解密速度。然而,在对称加密中,密钥的分发和管理是一个挑战,因为发送方和接收方都需要安全地共享密钥。常见的对称加密算法有DES、AES和RC4等。
  • 非对称加密: 非对称加密使用一对密钥,分别是公钥和私钥。发送方使用接收方的公钥进行加密,只有拥有相应私钥的接收方才能解密密文。公钥可以自由发布,而私钥必须保密。非对称加密算法相对于对称加密算法更安全,但也更复杂和计算密集。常见的非对称加密算法有RSA、ECC和DSA等。

在实际应用中,通常会结合对称加密和非对称加密的优势,构建更安全高效的加密系统。例如,使用非对称加密算法实现安全的密钥交换,然后使用对称加密算法加密传输的数据。这样可以保证安全性和效率的平衡。

20、什么是HTTP2?

HTTP/2(全称Hypertext Transfer Protocol version 2)是超文本传输协议(HTTP)的第二个主要版本。它是HTTP/1.1的后续版本,旨在改进传输速度和性能,并提供更好的用户体验。

下面是HTTP/2的一些主要特点和改进:

  • 多路复用(Multiplexing):HTTP/2支持同时在单个TCP连接上发送多个请求-响应消息。这种多路复用的机制避免了HTTP/1.1中的队头阻塞问题,提高了并发性能。
  • 二进制分帧(Binary Framing):HTTP/2将HTTP消息分割为更小的帧,并使用二进制格式进行传输和解析。相比于HTTP/1.1的文本格式,二进制分帧更高效,减少了传输的开销。
  • 头部压缩(Header Compression):HTTP/2使用了HPACK算法对请求和响应的头部进行压缩,减少了数据的传输量。这降低了延迟和带宽需求,并提高了性能。
  • 服务器推送(Server Push):HTTP/2允许服务器在客户端请求之前主动推送相关资源,以提前满足客户端的需求,减少请求的延迟和次数。
  • 流量控制(Flow Control):HTTP/2引入了流级别的流量控制机制,允许接收方控制数据的流动速度,避免了由于数据过载而导致的阻塞和延迟。

综上所述,HTTP/2通过多路复用、二进制分帧、头部压缩和服务器推送等特性,提高了传输性能、减少了延迟,并优化了用户体验。它已经得到广泛支持和应用,使得网络通信更加高效和可靠。

21、Session、Cookie和Token的主要区别?

什么是cookie

Cookie是由Web服务器发送给浏览器的小文件(key-value格式),在浏览器上保存用户相关的信息。当用户访问网站时,服务器可以通过设置响应头中的Set-Cookie字段来颁发一个Cookie给浏览器。浏览器会将该Cookie保存起来,并在之后的请求中将其发送给服务器。

通过保存在Cookie中的信息,服务器可以辨认用户的身份和状态。比如,服务器可以在Cookie中包含一个唯一的标识符来跟踪用户的会话(session),以实现用户登录认证、个性化设置、购物车功能等。每次浏览器向服务器发送请求时,都会自动携带相应的Cookie信息,从而维持用户的状态和体验。

需要注意的是,Cookie存储在用户的浏览器中,因此可以被用户主动删除或禁用。另外,虽然大多数Cookie只包含匿名的、不敏感的信息,但一些Cookie可能包含用户的个人信息或敏感数据,因此在使用Cookie时要注意保护用户隐私和信息安全。

除了基本的Cookie机制,现代的Web开发还引入了一些增强的技术和安全措施,如HttpOnly Cookie、Secure Cookie、SameSite Cookie等,以提供更好的安全性和隐私保护。

什么是session

Session是一种服务器端的机制,用于在浏览器和服务器之间跟踪用户会话信息。Session并不依赖于Cookie,尽管Cookie通常被用来传递Session ID。

当用户首次访问网站时,服务器会创建一个唯一的Session ID,并将该ID发送给浏览器。浏览器在后续的请求中可以通过Cookie或其他手段(如URL参数)将该Session ID发送回服务器。服务器根据Session ID来查找对应的会话数据,并识别出用户的身份和状态。

Session数据通常存储在服务器端的内存、数据库或缓存中。它可以包含用户的登录状态、购物车内容、表单数据等。通过Session,服务器可以在用户的多次请求之间保持会话的状态,并根据需要更新和管理会话数据。

与Cookie不同,Session数据存储在服务器端,用户无法直接修改。这样可以提供更高的安全性和防护措施,防止用户伪造会话信息。另外,服务器可以设置Session的过期时间,一旦超过该时间,会话数据将被自动销毁,释放服务器资源。

因此,Session是一种服务器端的机制,用于在用户与服务器之间跟踪和管理会话信息。它提供了一种状态保持的方法,使得服务器能够识别用户并提供个性化的服务。尽管Cookie通常用于传递Session ID,但Session并不直接依赖于Cookie。

cookie与session区别

Cookie和Session都是用于在浏览器和服务器之间跟踪会话信息的机制,但它们有一些区别。

  • 存储位置:Cookie数据存储在浏览器的Cookie文件中,而Session数据存储在服务器端。

  • 安全性:由于Cookie存储在浏览器中,因此可以被用户篡改或删除。而Session数据存储在服务器端,用户无法直接修改,提供了更高的安全性。

  • 存储容量:Cookie的存储容量较小,通常为几KB,很多浏览器都限制一个站点最多保存20个cookie。而session无此限制,且Session的存储容量可以更大,取决于服务器的配置。

  • 过期时间:Cookie可以设置过期时间,在过期前一直存在于用户的浏览器中。而Session可以设置过期时间或在用户关闭浏览器后自动销毁。

  • 占用服务器资源:session一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用cookie。

  • 使用方式:Cookie是通过在HTTP报文头中添加Set-Cookie字段将数据发送给浏览器,在后续的请求中附带在Cookie字段中发送回服务器。而Session是通过在服务器端生成一个唯一的Session ID,并将其发送给浏览器,在后续的请求中通过Cookie或其他方式传递Session ID。

总体来说,Cookie适合存储较小、安全性要求不高的数据,而Session适合存储较大、安全性要求较高的数据。Cookie存储在客户端,可以实现跨页面和跨站点的会话跟踪,而Session存储在服务器端,可以实现更可靠的会话管理和状态保持。

什么是Token

Token(令牌)是一种在客户端和服务端之间进行身份验证和授权的机制。它是由服务端生成的一串字符串,用于标识用户的身份和权限。

当用户第一次登录时,服务端会验证用户的用户名和密码,并生成一个Token。然后将该Token返回给客户端,在后续的请求中,客户端会携带这个Token作为身份凭证发送给服务端。

通过在每次请求中携带Token,服务端可以验证Token的有效性,从而确认请求的合法性和用户的身份。这样就避免了客户端频繁传递用户名和密码,减轻了服务器的压力,提高了系统的安全性和性能。

使用Token的好处包括:

  • 减少服务器频繁查询数据库验证用户身份的开销,提高了系统的响应速度和并发能力。
  • 提供了一种可扩展的身份验证机制,使得多个服务之间可以共享同一个Token,提高了用户体验。
  • 可以设置Token的过期时间,增加了安全性,一旦Token过期,客户端需要重新获取新的Token。

总结来说,Token是一种用于身份验证和授权的令牌机制,通过在客户端和服务端之间传递Token进行身份验证,减轻了服务器压力,提高了系统的安全性和性能。

session与token区别

  • Session机制将会话数据存储在服务器端,而Token机制则将身份验证信息存储在客户端。这是它们最重要的区别之一。
  • 在使用Session时,服务器需要维护会话数据,并在每次请求时进行验证。这可能导致服务器负载增加并减少扩展性。而Token机制则避免了这个问题,因为服务器无需存储会话数据,只需要对Token进行验证即可。
  • 另一个区别是安全性。Token通过使用加密算法和签名来保证安全性,防止伪造。相比之下,Session机制存在服务器压力增大,CSRF跨站伪造请求攻击,扩展性不强等问题。
  • 此外,Session适用于客户端代码和服务端代码运行在同一台服务器上的情况,而Token更适合于项目级的前后端分离,即前后端代码运行在不同的服务器上,因为Token可以跨多个服务器进行验证和共享。

总结来说,Token相比Session具有更好的安全性、扩展性和适用性,特别是在前后端分离的项目中,Token是更常见和推荐的身份验证和授权机制。

22、如果客户端禁止 cookie 能实现 session 还能用吗?

如果客户端禁止使用Cookie,会导致传统的Session机制无法正常工作,因为Session ID通常是通过Cookie在客户端和服务器之间进行传递的。但是,即使禁止使用Cookie,仍然有其他方法可以实现Session功能。

  • 一种方法是将Session ID通过URL传递或者隐藏表单传递。在每个请求中,将Session ID作为参数添加到URL中或者在表单中进行传递。服务器可以解析URL或表单中的Session ID来确认用户的会话状态。
  • 另一种方法是使用其他存储方式,如文件系统或数据库,来保存Session ID和会话数据。在每个请求中,客户端可以通过自定义的方式将Session ID传递给服务器,例如在Header中添加自定义字段。服务器可以根据该Session ID查找对应的会话数据,以维持会话状态。

需要注意的是,这些替代方案可能需要对现有代码和框架进行修改,并且会增加一些复杂性和开销。同时,安全性也需要仔细考虑,避免Session ID泄漏和恶意使用。

总结起来,尽管禁用Cookie可能会带来一些挑战,但仍然有办法通过其他手段实现Session功能,如URL传递、隐藏表单或其他自定义方式来传递Session ID,并结合其他存储方式来维护会话状态。

你可能感兴趣的:(Java进阶篇,网络,java,开发语言)