当前位置:   article > 正文

计算机网络常见知识点总结_syn报文长度

syn报文长度

网络

1.IP地址分类

在这里插入图片描述
网络为全为1的是广播地址,所以要减一,因此127减一为126
A类IP地址 地址范围1.0.0.0127.255.255.255。可用的A类网络有126个
B类IP地址地址范围128.0.0.0191.255.255.255。可用的B类网络有16382个
C类IP地址范围从192.0.0.0223.255.255.255。C类网络可达209万余个

TCP/IP协议族体系结构以及主要协议

TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同
的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。
在这里插入图片描述

2.TCP三次握手建立连接的发送序列号和确认序列号

客户端:发送X
服务端:发送Y, 确认X+1
客户端:发送X+1,确认Y+1

3.OSI七层模型的作用

第一层到第三层,负责创建网络通信连接的链路。

第四层到第七层,负责端到端的数据通信。

物理层:规定通信设备,通信链路的特性。

数据链路层:在物理层提供的比特流的基础上,建立相邻节点之间的数据链路,不可靠的物理介质提供可靠传输 ppp协议。

网络层:选择合适的网间路由完成两个计算机之间的多个数据链路,通过路由协议和地址解析协议(ARP)。IP,RIP(路由信息协议),OSPF(最短路径优先协议)

传输层:为应用程序之间提供端对端的逻辑通信。

会话层:验证访问和会话管理。

表示层:信息格式和语法的转化。

应用层:为操作系统或者应用程序提供可用的网络接口

4.OSI七层模型各层的常见协议

应用层

  • DNS (域名解析)
  • FTP(File Transfer Protocol)文件传输协议
  • HTTP (Hypertext Transfer Protocol)超文本传输协议
  • SSH (Secure Shell)安全外壳协议
  • RPC (Remote Procedure Call Protocol)(RFC-1831)远程过程调用协议

传输层

  • TCP(Transmission Control Protocol)传输控制协议
  • UDP (User Datagram Protocol)用户数据报协议

网络层

  • IP(IPv4 · IPv6) Internet Protocol(网络之间互连的协议)
  • ARP : Address Resolution Protocol即地址解析协议,实现通过IP地址得知其物理地址。
  • ICMP :(Internet Control Message
    Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息
  • RIP : 路由信息协议(RIP)是一种在网关与主机之间交换路由选择信息的标准。

5.TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接); UDP是无连接 的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和超时重传流量控制阻塞控制滑动窗口确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP对系统资源要求较多,UDP对系统资源要求较少
在这里插入图片描述

TCP报文格式

在这里插入图片描述
TCP报文由俩部分组成:TCP报头和TCP数据
TCP报文是TCP传输的数据单元

TCP报文头包括:
端口号:用来标识一台主机的不同进程

1) 源端端口号:源端口和IP层解析出来的IP地址标识报文的发送地,同时也确定了报文的返回地址
2) 对端端口号:表明了该数据报是发送给接收方计算机的具体的一个应用程序

序号和确定序号:TCP可靠传输的保障

1)序号:文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性
2) 确认序号:即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如收到一个报文段的序号为300,报文段数据部分共有100字节,回复的ACK的确认序号就是400

数据偏移:也叫做首部长度,以32位比特位为长度单位

1)使用4个比特位,因为报头数据中含有可选项字段,所以TCP报头的长度是不确定的,除去可选项字段TCP的长度为20字节,4bit最大表示的数据为15,15 * (32 / 8)= 60 ,故。TCP报头最大长度为60字节

保留:为将来定义新的用途保留,现在一般置0
标志位:UGR ACK PSH RST SYN FIN ,六个标志位代表六个不同的功能

1) UGR: 紧急指针标志,为 1 时表示紧急指针有效,为 0 则忽略紧急指针
2) ACK: 确认序号标志,为 1时表示确认序号有效,为 0 则表示报文中不含有确认信息,忽略确认字段号
3) PSH: push标志,为 1表示是带有push标志的数据,指示接收方在接收到数据以后,应尽快的将这个报文交付到应用程序,而不是在缓冲区缓冲
4) RST:重置连接标志,用于由主机崩溃或者其他原因而出现错误的连接,或者用于拒绝非法的报文段和拒绝连接请求
5) SYN:同步序号,用于连接建立过程,在请求连接的时候,SYN=1和ACK=0表示该数据段没有捎带确认域,而连接应答捎带一个确认,表示为SYN=1和ACK=1
6) FIN: 断开连接标志,用于释放连接,为 1 表示发送方已经没有数据发送,即关闭数据流

窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,以此来控制发送端的发送速率,从而达到流量控制。窗口大小是一个16比特位的字段,因而窗口大小最大为65535字节
校验和: 奇偶校验,此校验和是对整个TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得,由发送端计算和存储,并由接收端进行验证
紧急指针: 只有当URG标志置为1的时候,紧急指针才有效,紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式
选项和填充: 最常见的可选字段是最长报文的大小,又称为MSS,每个连接方通常在通信的第一个报文段(也就是第一次握手的SYN报文的时候)中指明这个选项,表示本端所能接受的最大报文段的长度。提示:选项长度不一定是32位的整倍数,所以要有填充位,即在这个字段中加入额外的零,以保证TCP头是32的整倍数
数据部分: TCP报文段中的数据部分是可选的,在一个建立连接和断开连接的时候,双方交换的报文段只有TCP的首部。如果一方没有数据要发送,也灭幼使用任何数据的首部俩确认收到的数据,在处理超时的许多情况中,也会发送不带你任何数据的报文段。

6.TCP的三次握手和四次挥手:

TCP属于传输层协议,是整个TCP/IP协议族中最重要的协议之一。它在IP提供的不可靠数据服务的基础上为应用程序提供了一个可靠的 、面向连接的 、全双工 的数据传输服务。
在这里插入图片描述
1.序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
2.确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
3.确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
4.同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建立连接时才会被置1,握手完成后SYN标志位被置0。
5.终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
注意:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

7.三次握手

所谓三次握手,即建立TCP连接,需要客户端和服务端总共发送至少三个包确认连接的建立。
图解:
在这里插入图片描述

第一次握手: 客户端将同步标志位SYN置为1,表示想与服务端建立连接,并随机产生一个序列号值seq为x的TCP数据包发送给服务端

第二次握手: 服务器端接收到来自客户端的TCP报文之后,将标志位SYN和ACK置为1,表示“确认客户端的报文seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”,并且向客户端发送一个确认号ack为x+1,序列号seq为随机产生的TCP数据包

第三次握手: 客户端接收到服务器端发送的SYN+ACK包将标志位为ACK置为1,表示“确认收到服务器端同意连接的信号并向服务器发送一个确认号ack为y+1,序列号seqx+1的确认包,此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手

8.为什么是三次握手,四次握手可以吗?

第一次握手: 服务端可以确认客户端的发送能力正常
第二次握手: 客户端可以确认服务端的发送能力和接收能力正常
第三次握手: 服务端可以确认客户端的接收能力正常
也就是说,通过三次握手已经可以确认双方收发功能都正常,保证了TCP的可靠性,四次握手当然也可以只是是显得比较多余。

9.TCP的三次握手是否可以携带数据?

第一次和第二次是不可以携带数据的,但是第三次是可以携带数据的。

10.TCP协议运行时包含哪几个阶段

TCP协议运行时包含连接创建、数据传输、连接终止三个阶段

四次挥手

四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。
图解:
在这里插入图片描述
第一次挥手: 客户端将释放标志位FIN置为1,表示想与服务端释放连接,并向服务器端发送一段序列号值seq=u(随机)的TCP报文。随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。

第二次挥手: 服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,将确认标记位ACK置为1,表示“接收到客户端发送过来的释放连接请求”;并且向客户端发送一个确认号ack为u+1,序列号seq为随机产生的TCP数据包。随后服务器端开始准备释放服务器端到客户端方向上的连接。
客户端收到从服务器端发出的TCP报文之后,确认了服务器端收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段;前"两次挥手"既让服务器端知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,可以确认关闭客户端到服务器端方向上的连接了

第三次挥手: 服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,将标记位FIN,ACK都置为1,表示“已经准备好释放连接了”。并再次向客户端发送一个确认号ack为u+1,序列号seq为随机产生的TCP数据包。注意:这里的ACK并不是确认收到服务器端报文的确认报文。 随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。

第四次挥手: 客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,将确认标记位ACK置为1,表示“接收到服务器准备好释放连接的信号”。并且向服务端发送一个确认号ack为w+1,序列号seq为u+1为TCP数据包。随后客户端开始在TIME-WAIT阶段等待2MSL。服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。

后“两次挥手”既让客户端知道了服务器端准备好释放连接了,也让服务器端知道了客户端了解了自己准备好释放连接了。于是,可以确认关闭服务器端到客户端方向上的连接了,由此完成“四次挥手”。

11.为什么上图中的客户端在TIME-WAIT状态必须等待2MSL时间呢?

第一、为了保证客户端发送的最后一个ACK报文能够到达服务器端。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。服务器端会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,服务器端就无法按照正常的步骤进入CLOSED状态

第二、客户端在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。

12.为什么“握手”(建立连接)是三次,“挥手”(释放连接)需要四次?

因为建立连接时,服务端接收到来自客户端的连接请求报文时,不需要做任何准备,就可以直接给客户端发送一个SYN建立连接报文与ACK确认接收报文,开始建立连接。而TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"挥手"传输的,之所以要分开传输是因为服务端突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。
原文链接:https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc

13.什么情况下,连接处于CLOSE_WAIT状态呢?

某种情况下客户端关闭了连接,但是我方忙于读写,没有关闭连接
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。(就是等待关闭的状态)

14.访问一个域名,整个过程发生了什么

(1)浏览器向 DNS 服务器发送 www 域名解析请求;
(2)DNS 服务器返回解析后的 ip 给客户端浏览器,浏览器向该ip发送页面请求;
(3)DNS 服务器接收到请求后,查询该页面,并将页面发送给客户端浏览器;
(4)客户端浏览器接收到页面后,解析页面中的引用,并再次向服务器发送引用资源请求;
(5)服务器接收到资源请求后,查找并返回资源给客户端;
(6)客户端浏览器接收到资源后,渲染,输出页面展现给用户。

15.浏览器输入一个网址之后,按照TP/IP参考模型,从应用层到网络层各使用了哪些协议?

(应用层:HTTP、DNS;传输层:TCP、UDP;网络层:IP、ICMP、ARP)

16.网关是什么?

网关英文名称为Gateway,又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。

17.网关的作用是什么?

简单来说,网关是设备与路由器之间的桥梁,由它将不同的网络间进行访问的控制,转换,交接等等。
网关是将两个使用不同传输协议的网络段连接在一起的设备,网关一般用作网络的入口和出口点,因为所有数据必须在路由之前通过或与网关通信。在大多数基于IP的网络中,唯一不通过至少一个网关的流量是在同一局域网(LAN)段上的节点之间流动的流量。在个人或企业场景中使用网关的主要优点是将互联网连接简化为一个设备。在企业中,网关节点还可以充当代理服务器和防火墙。

18.OSI模型数据传输

我就当你是在说OSI七层模型了,TCP/IP四层模型基本上来说没什么可分析数据的价值。
上层就不说了,就是接口类型。说说下面四层,由高到低分别为传输层,网络层,数据链路层,物理层。
一个数据从物理层发送到数据链路层,就是一个解密的过程。是由bit为单位发送的,也就是0001010100001这种数据。
到了数据链路层以后,把bit组合成字节,MAC地址就是一种,然后拆掉头部包尾部包,解校验序列。
到了网络层以后,再拆掉IP的头部包。
到了传输层后,再拆掉TCP包,数据就成功的到达了上层。
上层数据发送到下层就是反过来。
把上层数据封装TCP头部,IP头部,帧头部尾部校验序列,再转化为2进制,就是这样。
一个TCP/IP的数据大约就是 ’帧头+IP+TCP+数据+帧尾+校验‘。

HTTP与TCP区别

1、TCP对应与传输层、而HTTP对应于应用层,所以HTTP协议是建立在TCP协议之上的;

2、HTTP底层是利用TCP/UDP协议传输的,所以支持HTTP也就一定支持TCP/UDP;

3、TCP是网络传输协议, HTTP是超文本传输协议;

    TCP是底层协议,定义的是数据传输和连接方式的规范。
    HTTP是应用层协议,定义的是传输数据的内容的规范。
  • 1
  • 2

4、HTTP是无状态的短链接,而TCP是有状态的长连接;

HTTPS和HTTP的区别是什么

HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTP是一个应用层协议,它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口
HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全

HTTPS和HTTP的区别主要如下:

  • HTTP 明文传输,数据未加密,安全性较差https数据传输过程加密 使用 HTTPS 协议需要到 CA申请证书,一般免费证书较少,因而需要一定费用。
  • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包而HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所共12 个包
  • http 和 https使用完全不同的连接方式,http的连接很简单,是无状态的HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。端口也不一样,前者是80,后者是 443
  • HTTPS 建构在 SSL/TLS 之上的 HTTP 协议,更耗费服务器资源。

长连接和短连接的区别,有哪些优劣

定义
长连接:一次TCP连接上可以传送多个HTTP请求和响应;
短连接:一次传输完成立即断开TCP连接;下次传输需要重新TCP三次握手;

使用场景
长连接:适用于操作频繁、一对一场景,如数据库连接;

短连接:适用于一对多场景,如WEB请求;

优缺点
长连接省去较多的建立和关闭连接操作,但连接数目较多时,会影响服务器的性能;

短连接管理起来简单,但频繁建立和关闭连接会耗费CPU与内存的使用;

无状态

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的

20.SSL的作用是什么

1.认证用户和服务器,确保数据发送到正确的客户机和服务器
2.加密数据以防止数据中途被窃取
3.维护数据的完整性,确保数据在传输过程中不被改变

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

21.HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种是确认网站的真实性。

22.TLS 的完整过程需要三个算法(协议),密钥交互算法,对称加密算法,和消息认证算法

23.HTTPS 的整体过程分为证书验证和数据传输阶段

证书验证阶段:

  • 浏览器发起 HTTPS 请求。( TLS 握手请求)
  • 服务端返回 证书(包含服务器公钥S_PuKey)、对称加密算法种类及其他相关信息。
  • 客户端验证证书是否合法,如果不合法则提示告警。

数据传输阶段:

  • 当证书验证合法后,在本地生成随机数。
  • 通过公钥加密随机数,并把加密后的随机数传输到服务端。
  • 服务端通过私钥对随机数进行解密。
  • 服务端通过客户端传入的随机数构造对称加密算法,之后的数据交互通过对称加密算法进行加解密。(对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法)

服务器利用自己唯一的私钥对客户端发来的对称密钥进行解密,在此过程中,中间方无法对其解密(即使是客户端也无法解密,因为只有服务器端拥有唯一的私钥),保证了对称密钥在收发过程中的安全,此时,服务器端和客户端拥有了一套完全相同的对称密钥。

最后,总结一下https传输过程:
1.客户端发起 HTTPS 请求,服务端返回证书,客户端对证书进行验证,验证通过后本地生成用于构造对称加密算法的随机数。
2.通过证书中的公钥对随机数进行加密传输到服务端(随机对称密钥),服务端接收后通过私钥解密得到随机对称密钥,之后的数据交互通过对称加密算法进行加解密。(既有对称加密,也有非对称加密)

证书阶段是非对称加密,数据传输阶段是对称加密

对称加密和非对称加密

对称加密

对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。

常见的对称加密算法:DES,AES,3DES等等。

非对称加密

非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。

常见的非对称加密算法:RSA,ECC

24.为什么数据传输是用对称加密?

答:HTTP的应用场景中通常端与端之间存在大量的交互,非对称加密的加解密效率非常低。
另外,在 HTTPS的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密

25.为什么需要证书?

答:防止“中间人”攻击,同时可以为网站提供身份证明。

26.使用 HTTPS 会被抓包吗?

抓包:就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等
答:会被抓包,HTTPS 只防止用户在不知情的情况下通信被监听,如果用户主动授信,是可以构建“中间人”网络,代理软件可以对传输内容进行解密

27.HTTP常用的状态码

下面是常见的HTTP状态码:
状态码 解释
100 服务器收到了请求, 请客户端继续发送
200 请求成功,一般用于 GET 与 POST 请求
201 成功请求并创建了新的资源
202 已经接受请求,但未处理完成
203 非授权信息
204 服务器成功处理,但未返回内容
301 请求的资源已被永久的移动到新URL,资源(网页等)被永久转移到其它URL(永久重定向
302 资源临时被移动,客户端应继续使用原有URL,临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI(临时重定向
303 使用GET和POST请求查看其它地址
304 请求已被允许,但文档的内容并没有改变
305 所请求的资源必须通过代理访问
307 使用GET请求重定向
400 请求无效,前端数据与后端不一致
401 当前请求需要用户验证
403 服务器理解请求客户端的请求,但是拒绝执行此请求,也就是禁止访问
404 请求的资源(网页等)不存在
405 客户端请求中的方法被禁止
408 服务器等待客户端发送的请求时间过长,超时
410 客户端请求的资源已经不存在
413 由于请求的实体过大,服务器无法处理,因此拒绝请求
414 请求的URL过长
415 服务器无法处理请求附带的媒体格式
416 客户端请求的范围无效
500 服务器内部错误,无法完成请求
501 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 由于超载或系统维护,服务器暂时的无法处理客户端的请求
505 服务器不支持请求的HTTP协议的版本

HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。

HTTP状态码共分为5种类型:
HTTP状态码分类

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

28.HTTP请求方法get和post有什么区别?

1:Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。
2:Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度限制,只能 传递大约1024字节.
3:Post就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get 之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post 的信息作为http请求的内容,而Get是在Http头部传输的。

29.输入url发出请求的过程经历了什么**

DNS解析
DNS解析可以理解为主寻找这个IP地址的过程,其中如果找到IP地址会进行本地缓存,以便下次继续使用
TCP连接
HTTP协议是使用TCP作为其传输层协议的
客户端发送HTTP请求
HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。请求正文一般是一些需要客户端向服务端发送的数据
服务器处理请求并返回HTTP报文
HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
响应报头:常见的响应报头字段有: Server, Connection…。
响应报文:服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
浏览器解析渲染页面
浏览器一边解析一边渲染
结束

30.TCP的长连接和短连接

http://blog.sina.com.cn/s/blog_6d39b5be0101k6v4.html
一、长连接与短连接:
长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。

二、长连接与短连接的操作过程:短连接的操作步骤是:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:建立连接——数据传输…(保持连接)…数据传输——关闭连接

三、长连接与短连接的使用时机
长连接:长连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。每个TCP连接的建立都需要三次握手,每个TCP连接的断开要四次握手。
如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作下次操作时直接发送数据就可以了,不用再建立TCP连接。
例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,频繁的socket创建也是对资源的浪费。
短连接:web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。
试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。总之:长连接和短连接的选择要视需求而定。

32.半连接队列和全连接队列,什么是syn flood攻击,如何应对syn flood攻击?

https://www.jianshu.com/p/ff26312e67a9
server端的半连接队列(syn队列)
在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包开设一个条目(服务端在接收到SYN包的时候,就已经创建了request_sock结构,存储在半连接队列中),该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包(会进行第二次握手发送SYN+ACK 的包加以确认)。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
该队列为SYN 队列,长度为 max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog) ,在机器的tcp_max_syn_backlog值在/proc/sys/net/ipv4/tcp_max_syn_backlog下配置。
server端的完全连接队列(accpet队列)
当第三次握手时,当server接收到ACK 报之后, 会进入一个新的叫 accept 的队列,该队列的长度为 min(backlog, somaxconn),默认情况下,somaxconn 的值为 128,表示最多有 129 的 ESTAB 的连接等待 accept(),而 backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,listen 里面的 backlog 可以有我们的应用程序去定义的。
当Client发送SYN包之后挂了(syn flood攻击)
Client发送SYN包给Server后挂了,Server回给Client的SYN-ACK一直没收到Client的ACK确认,这个时候这个连接既没建立起来,也不能算失败。这就需要一个超时时间让Server将这个连接断开,否则这个连接就会一直占用Server的SYN连接队列中的一个位置,大量这样的连接就会将Server的SYN连接队列耗尽,让正常的连接无法得到处理。
目前,Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s,TCP才会把断开这个连接。由于,SYN超时需要63秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的SYN包给Server(俗称 SYN flood 攻击),用于耗尽Server的SYN队列。对于应对SYN 过多的问题,linux提供了几个TCP参数:tcp_syncookies、tcp_synack_retries、tcp_max_syn_backlog、tcp_abort_on_overflow 来调整应对。
net.ipv4.tcp_synack_retries #内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries #内核放弃建立连接之前发送SYN包的数量
为了应对SYNflooding(即客户端只发送SYN包发起握手而不回应ACK完成连接建立,填满server端的半连接队列,让它无法处理正常的握手请求),Linux实现了一种称为SYNcookie的机制,通过net.ipv4.tcp_syncookies控制,设置为1表示开启。简单说SYNcookie就是将连接信息编码在ISN(initialsequencenumber)中返回给客户端,这时server不需要将半连接保存在队列中,而是利用客户端随后发来的ACK带回的ISN还原连接信息,以完成连接的建立,避免了半连接队列被攻击SYN包填满。

33.域名解析过程的递归查询和迭代查询

https://blog.csdn.net/weixin_42061048/article/details/80170991
1.递归查询
主机向本地域名服务器的查询一般都是采用递归查询所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
在这里插入图片描述

2.迭代查询
本地域名服务器向根域名服务器的查询通常是采用迭代查询。迭代查询的特点是这样的:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器,“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询(而不是替本地域名服务器进行后续的查询)。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应该向哪一个权限域名服务器进行查询。最后,知道了所要解析的域名的IP地址,然后把这个结果返回给发起查询的主机。当然,本地域名服务器也可以采用递归查询,这取决于最初的请求报文的设置是要求使用哪一种查询方式。
在这里插入图片描述

33.ICMP协议的两个应用——Ping和Traceroute

https://www.jianshu.com/p/32bc2749a831
首先Ping的原理用到了ICMP协议。
ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议(即不关注端口号)。
报文格式
ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。

Ping
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性
Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
Traceroute
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。打印出可执行程序主机,一直到目标主机之前经历多少路由器。返回到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。
其次若ping的是域名需要使用DNS协议,在使用DNS协议的过程中可能会调用ARP协议。(关于详细细节可见:浏览器输入网址到显示过程)

34.IP地址和MAC地址有什么区别?

  • IP地址是应用于网络层的逻辑地址,在组网时根据需要可以灵活规划和分配;不同的子网中,IP地址可以相同
  • MAC地址是应用于以太网数据链路层的网卡地址,在生产时就固化在硬件中,通常具有唯一性,不可更改
  • IP地址长度4Bytes,通常还有一个匹配的掩码;MAC地址长度6Bytes。
  • MAC地址是由网卡生产厂商向IEEE申请的;IP地址是由ISP向当地的管理机构申请的,有APNIC、ARIN、RIPE、LACNIN、AFRINIC等几个。
  • 两者通过ARP协议建立联系。

ARP:即地址解析协议,实现通过IP地址得知其物理地址
RARP:逆地址解析协议。 将物理地址解析为IP地址

在这里插入图片描述

BIO、NIO和AIO的区别:

BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善

NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理

AIO:异步非阻塞的IO,服务器实现模式为一个有效请求一个线程,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作,异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。

异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。

BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。

无效请求(当连接没有数据)

AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。

NIO与BIO最大的区别就是只需要开启一个线程就可以处理来自多个客户端的IO事件,这是怎么做到的呢?
就是多路复用器,可以监听来自多个客户端的IO事件

轮询法的概念是:由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始

AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

35.select、poll、epoll 区别总结:

select、poll、epoll都是IO多路复用的机制,但是他们的机制有很大的区别

I/O多路复用,I/O就是指的我们网络I/O,多路指多个TCP连接(或多个Channel),复用指复用一个或少量线程。串起来理解就是很多个网络I/O复用一个或少量的线程来处理这些连接

1、支持一个进程所能打开的最大连接数
select
单个进程所能打开的最大连接数有FD_SETSIZE宏定义,其大小是32个整数的大小(在32位的机器上,大小就是3232,同理64位机器上FD_SETSIZE为3264),当然我们可以对进行修改,然后重新编译内核,但是性能可能会受到影响,这需要进一步的测试。

poll
poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的

epoll
虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的机器可以打开20万左右的连接

2、FD剧增后带来的IO效率问题
select

因为每次调用时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的“线性下降性能问题”。

poll
同上

epoll
因为epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题。

3、 消息传递方式
select

内核需要将消息传递到用户空间,都需要内核拷贝动作

poll
同上

epoll
epoll通过内核和用户空间共享一块内存来实现的。

总结:
综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。
1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

36.TCP怎么保证可靠传输的?WebSocket的特点?

TCP: 建立连接、在连接中进行传输、通过三次握手完成连接(是可靠协议)、效率会稍低
     Socket和ServerSocket
     传输步骤:
       1、建立客户端和服务器端
       2、建立连接后,通过Socket中的IO流进行数据的传输
       3、关闭socket
UDP:不需要建立连接、将数据及源和目的封装成包(限制在64K内)、不可靠协议、速度快
     DatagramSocket与DatagramPacket
     传输步骤:
        1、建立发送端,接收端;
        2、建立数据包;  
        3、调用Socket的发送接受方法;
        4、关闭Socket

怎么保证可靠传输
(1)超时重传超过时间无应答重传
(2)滑动窗口源主机在收到确认消息之前可以传输的数据的大小称为窗口大小。用于管理丢失数据和流量控制。发送窗口的大小根据网络传输情况调整。窗口用来缓存字节流,接收方和发送方都有,发送方发送的数据包中包含了窗口大小,使得两边窗口一致;
(3)流量控制控制发送方的发送速度
(4)拥塞控制如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当 控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制 是为了降低整个网络的拥塞程度。
(5)校验和通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送

37.Socket

就是为了网络服务提供的一种机制;通信的两端都有Socket;网络通信其实就是Socket间的通信;数据在两个Socket间通过IO传输
websocket与socket的区别?
Socket并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。而websocket的话的是一个网络层协议。

WebSocket:WebSocket是一种在单个TCP连接上进行全双工通信的协议,是一个应用层协议,HTTP升级,因为长短连接都是需要 client 通过 request ,server 才会 response;而 websocket 则只需一次http请求, server 就可以主动推送消息具有持久化的特性,比起轮询,减少了资源消耗。

UDP怎么实现可靠传输?

UDP要想可靠,就要接收方收到UDP之后回复个确认包,发送方有个机制,收不到确认包就要重新发送,每个包有递增的序号,接收方发现中间丢了包就要发重传请求,当网络太差时候频繁丢包,防止越丢包越重传的恶性循环,要有个发送窗口的限制,发送窗口的大小根据网络传输情况调整,调整算法要有一定自适应性

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层

最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
1、添加seq/ack机制,确保数据发送到对端
2、添加发送和接收缓冲区,主要是用户超时重传。
3、添加超时重传机制。

详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。

实现确认机制、重传机制、窗口确认机制。
如果你不利用linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
发送:包的分片、包确认、包的重发
接收:包的调序、包的序号确认
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT

怎么判断游戏底层是基于TCP还是UDP?

一般来说对实时性要求比较高的就是基于UDP协议,例如王者,吃鸡这些
回合制游戏这类对实时性要求不高的,例如卡牌游戏等,用tcp实现底层代码比较简单,因为非可靠传输会增加不少代码量

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/162543
推荐阅读
相关标签
  

闽ICP备14008679号