面试2——计算机网络知识储备

1.同步、非同步 、阻塞、非阻塞 I/O 模式的操作理解

同步、异步:主要针对的对象是进程与内核之间的交互过程。同步在进程触发I/O操作的时候,会主动以等待或者轮询的方式去查看内核中的I/O操作是否就绪。异步就是进程触发I/O操作之后就不管这个操作了,可以去干其他的事,反而内核完成这个I/O操作之后,内核会给异步进程一个I/O完成的通知。异步主要特点就是会得到一个通知。
阻塞、非阻塞:主要针对的对象是进程访问数据的过程。当I/O操作就绪之后,阻塞方式下的读取或者写入函数会抑制等待数据缓冲区中的数据状态(有数据或者无数据)的改变而随之改变。非阻塞式的读取或者写入操作不管数据缓冲区里面是什么样的状态都会返回数据或者一个状态值。
通常I/O操作抽象为两个状态:
1.用户态等待内核态将数据准备好,即同步、异步申请 I/O。
2.将数据将内核态拷贝到用户态,即阻塞、非阻塞读取数据。

同步阻塞:在以上两个阶段,用户态都会阻塞等待内核准备数据以及拷贝数据。
在这里插入图片描述
同步非阻塞:在第一阶段内核准备数据的过程中,用户态不会阻塞,会以轮询的方式返回状态值,儿第二个阶段拷贝数据阶段,一样会阻塞等待数据拷贝完成。
在这里插入图片描述
I/O多路复用:I/O复用也是属于同步的。它和同步阻塞模式有一些一样,两个阶段都是阻塞的,但是I/O复用利用较小的代价来实现了同时监听多个I/O事件的目的。利用一个线程来同时监听多个文件描述符,然后将就绪的文件描述符关联的事件交给后面的内核来处理(这里用多种操作方式,线程池等)。I/O复用的实现如今还多是依赖于操作系统的select、poll、epoll等框架。目前java,linux主流还是用epoll同步非阻塞式I/O来是想大量并发的服务。epoll的机制请参考
epoll实现原理在这里插入图片描述
异步I/O:第一阶段和内核态交互表达I/O请求后立马返回,直到最后数据拷贝完成,内核会返回一个信号到用户态。这也是最重要的一点。
在这里插入图片描述

2. 介绍下proactor和reactor

reactor、proactor两种高效的事件处理模式
Reactor:(同步I/O模型),中心思想是将所要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程开始阻塞(工作线程也在阻塞)监听文件描述符判断是否有事件发生,将有事件发生的文件描述符按照事件的类型分发到相应的工作处理线程中,等待工作线程的处理,而主线程则继续监听。其中读写、接受新的客户端连接、新的客户的请求都有相应的工作线程来完成。

Reactor是一种事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。

Proactor:(异步I/O模型),与Reactor思想不同,Proactor的所有I/O操作都由主线程和内核来处理,其他的工作线程仅仅负责逻辑业务。在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。

可以看出两者的区别:
Reactor是在事件发生时就通知事先注册的事件(读写由处理函数完成);
Proactor是在事件发生时进行异步I/O(读写由OS完成),待IO完成事件分离器才调度处理器来处理。

3.reactor的组成

1.Reactor:反应堆管理器(主线程)整个反应堆核心,
1.用于注册、删除事件的文件描述符,
2.运行事件循环
3.监听事件的文件描述符是否就绪,将就绪的事件分发到回调函数或者分发到同步事件多路分离器。
2.同步事件多路分离器(event demultiplexer):事件的到来是随机的、异步的,无法预知程序何时收到一个客户连接请求或收到一个信号。所以程序要循环等待并处理事件,这就是事件循环。在事件循环中,等待事件一般使用I/O复用技术实现。在linux系统上一般是select、poll、epol_waitl等系统调用,用来等待一个或多个事件的发生。I/O框架库一般将各种I/O复用系统调用封装成统一的接口,称为事件多路分离器。调用者会被阻塞,直到分离器分离的描述符集上有事件发生。
3.事件处理器(event handler):I/O框架库提供的事件处理器通常是由一个或多个模板函数组成的接口。这些模板函数描述了和应用程序相关的对某个事件的操作,用户需要继承它来实现自己的事件处理器,即具体事件处理器。因此,事件处理器中的回调函数一般声明为虚函数,以支持用户拓展。
4. 具体的事件处理器(concrete event handler):是事件处理器接口的实现。它实现了应用程序提供的某个服务。每个具体的事件处理器总和一个描述符相关。它使用描述符来识别事件、识别应用程序提供的服务。

V0L0dKUUpGSg==,size_16,color_FFFFFF,t_70)

4.TIME_WAIT时长,为什么?

如图所示,四次回收断开连接的最后一次客户端向服务器发送ACK应答确认断开连接,但是在发送过程中也就是服务端还没有收到这一条消息的时候他仍然还在向客户端发送数据。如果客户端应答之后立即关闭将会丢失数据还会使得服务端收到连接异常RST响应从而导致服务端不能正常关闭。所以在客户端发送了最后一次应答ACK之后会等2MSL(MSL指的是数据包在网络中的最大生存时间)。
在这里插入图片描述

5.TIME_WAIT危害

如上,为了保证TCP可靠性连接,2MSL的等待时间机制被创造出来。但是在高并发短连接的TCP服务器场景下,当服务器作为主动关闭连接的一方时,每个连接就会有一个2MSL的时间让服务器继续维护连接的这个套接字,也即是会占用一个文件描述符,而文件描述符是有限的,如果持续的高并发,会导致一些客户端连接失败。

在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。

解决方案:设置套接字选项为S0_REUSEADDR来通知内核,当端口处于高并发,忙碌的时候,TCP处于TIME_WAIT状态时可以重复使用同一端口,这样SO_REUSEADDR就可以避免TIME_WAIT状态。

存在即是合理的,既然TCP协议能盛行四十多年,就证明他的设计合理性。所以我们尽可能的使用其原本功能。
依靠TIME_WAIT状态来保证我的服务器程序健壮,服务功能正常。
那是不是就不要性能了呢?并不是。如果服务器上跑的短连接业务量到了我真的必须处理这个TIMEWAIT状态过多的问题的时候,我的原则是尽量处理,而不是跟TIMEWAIT干上,非先除之而后快。
如果尽量处理了,还是解决不了问题,仍然拒绝服务部分请求,那我会采取负载均衡来抗这些高并发的短请求。持续十万并发的短连接请求,两台机器,每台5万个,应该够用了吧。一般的业务量以及国内大部分网站其实并不需要关注这个问题,一句话,达不到时才需要关注这个问题的访问量。

6.IP为什么要分片

以太网中最大的可传输IP报文为1500字节,所以如果所传输的数据帧大小超过1500字节,那么就需要分片之后进行传输。
IP协议在传输数据包是会将报文分成若干片后进行传输,并在目标系统中进行重组,在每个分片头部都有记录了IP包的ID信息,以保证在同一个数据包在到达目标之后能正确组装。

7.项目中说用到线程池,开多大,为什么运用线程池?

为什么需要用到线程池?适用场景:web,email以及数据库等大量短连接的服务场景,即单位时间内处理数目巨大的连接请求,但处理时间去相对较短。
多线程的情况下可以最大限度的发挥多核处理器的计算能力,提高系统的吞吐量和性能。但是随意的使用多线程,对系统的性能反而有不利的影响。大量的线程会抢占CPU的资源,cpu在不停的在各个线程的上下文中进行切换,从而没有时间去处理线程中的任务。因此为了避免频繁的创建和销毁线程而消耗的系统资源,让创建的线程进行复用,就有了线程池的概念。线程池中,有一部分活跃的线程,如果需要,就去线程池里取线程使用,用完即归还到线程池中,这样就避免了创建和销毁线程所需要用的开销,线程池也会对线程数量有一定量的限制,以避免由于线程数量过多造成的资源浪费或者内存溢出。

构建服务器应用程序的一个简单模型是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。实际上对于原型开发这种方法工作得很好,但如果试图部署以这种方式运行的服务器应用程序,那么这种方法的严重不足就很明显。每个请求对应一个线程(thread-per-request)方法的不足之一是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。

那么多线程有这么多的好处和优势,那么在一个线程池中开多少线程是合理的呢?
线程池的最佳大小取决于可用处理器的数目以及工作队列中的任务的性质,在一个具有N个处理器的单个工作队列中所需要的线程数在N,或者N+1是可最大利用CPU的处理能力。但是在处理需要等待I/O事件的时候(例如Socket/http等),需要对每个需求所等待的时间(WT)与服务器响应时间(ST)的之间的比例,一般称之为(WT/ST),那么一个具有N个处理器的系统,需要大概设置 N*(1+WT/ST)个线程来保证CPU得到最大的资源利用率。

java中常用的有四种线程池:稍等分解

8.select、poll和epoll区别

1.select ,基于无差别轮询的机制来对fd文件描述符进行询问查看,有上限文件描述符个数 1024 限制,时间复杂度为O(N)
2.poll,和select 一样,O(N),只是没有上限1024的限制,但是随着文件描述符的增加,它的性能会有所下降。
3.epoll,看做event poll,基于红黑树和链表储存结构。它将所有的文件描述符事件存储到树上,然后将有响应的事件取出存入事件响应链表,通过直接对链表结构进行访问从而节省内核开销。时间复杂度为O(1).
epoll,通过回调函数来讲活跃的连接存放进事件响应链表。

1.select和poll的动作基本一致,只是poll采用链表来进行文件描述符的存储,而select采用fd标注位来存放,所以select会受到最大连接数的限制,而poll不会。
2.select、poll、epoll虽然都会返回就绪的文件描述符数量。但是select和poll并不会明确指出是哪些文件描述符就绪,而epoll会。造成的区别就是,系统调用返回后,调用select和poll的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll则直接处理即可。
3.select、poll都需要将有关文件描述符的数据结构拷贝进内核,最后再拷贝出来。而epoll创建的有关文件描述符的数据结构本身就存于内核态中,系统调用返回时利用mmap()文件映射内存加速与内核空间的消息传递:即epoll使用mmap减少复制开销。
4.select、poll采用轮询的方式来检查文件描述符是否处于就绪态,而epoll采用回调机制。造成的结果就是,随着fd的增加,select和poll的效率会线性降低,而epoll不会受到太大影响,除非活跃的socket很多。
5.epoll的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符

三种I/O复用模型具体使用如epoll实现select/poll实现

9.select什么情况返回

1.当有事件发生是,其中包括读写事件,异常事件。
2.自己设置的时间事件。timeout

1.NULL,阻塞等待fd事件的发生,有则返回一个正值,无则返回0
2.具体时间,在这一时间段内发生阻塞,过后监听事件的发生,有返回正值,无返回0
3.传入0,立即返回事件,有返回正值,无返回0

10.epoll可读情况有哪些

epoll有两种触发模式,分别为水平触发LT、边沿触发ET。两种触发模式的区别在于对数据缓冲区里数据的读取方法。
具体详见LT/ET触发模式详解
epoll 可读还是需要在epoll_wait()阻塞等待的状态而定。还有EPOLLIN(读事件)、EPOLLOUT(写事件)的设置。

11. 如何设置非阻塞

如何将一个socket套接字设置为非阻塞模式,一般有两种方法:
1.fcntl函数:flags | O_NONBLOCK

flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式;

设置之后,每次对socket的操作都是非阻塞。
2. recv, send 函数的最后有一个 flag 参数可以设置成 MSG_DONTWAIT
临时将 sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。

recv(sockfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式的消息发送
send(scokfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息接受

13.什么是零拷贝?

试想一个这样的场景:通过网络向服务端申请文件下载。那么这个过程传统的是,从服务端的磁盘将文件拷贝到页缓存区,再拷贝到用户空间缓存,再拷贝到socket缓存区,最后通过网络到达客户端缓存区。这样一份文件会有好几次的拷贝,其中两次CPU拷贝无疑大大加重了服务端cpu的工作。
在这里插入图片描述
所以,零拷贝技术主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,主要就是利用各种零拷贝技术,避免让CPU做大量的数据拷贝任务,减少不必要的拷贝,或者让别的组件来做这一类简单的数据传输任务,让CPU解脱出来专注于别的任务。这样就可以让系统资源的利用更加有效。
方法:使用sendfile可以减少一次的CPU拷贝过程
在这里插入图片描述
能否再去掉一次CPU拷贝?
借助于硬件上的帮助,我们是可以办到的。之前我们是把页缓存的数据拷贝到socket缓存中,实际上,我们仅仅需要把缓冲区描述符传到socket缓冲区,再把数据长度传过去,这样DMA控制器直接将页缓存中的数据打包发送到网络中就可以了。
在这里插入图片描述
总结一下,sendfile系统调用利用DMA引擎将文件内容拷贝到内核缓冲区去,然后将带有文件位置和长度信息的缓冲区描述符添加socket缓冲区去,这一步不会将内核中的数据拷贝到socket缓冲区中,DMA引擎会将内核缓冲区的数据拷贝到协议引擎中去,避免了最后一次拷贝。

作者:卡巴拉的树
链接:https://www.jianshu.com/p/fad3339e3448
大佬链接

14.tcp与udp的区别以及应用场景

1.TCP :可靠,面向连接,面向字节流,一对一,三次握手,四次挥手,拥塞避免,滑动窗口,快恢复,快重传等等机制
应用场景:文件传输,邮件,http,一个字稳,不保证快,保证稳定。
2.UDP:不可靠,面向无连接的,一对多,多对多,多对一,一对一,随缘。面向报文。
应用场景:即时通信,视频、语音通话。一个字,快,但是不保证稳定。

详解请转

15.如何设计一个可靠的udp

TCP通过确认机制、超时重传、滑动窗口等来保证可靠性,UDP在传输层没有这些机制来保证其可靠传输,所以只能在应用层来保证UDP的可靠性,为了让UDP保证可靠性的设计,也就是仿照TCP的机制在UDP应用层将其实现。
当前,已有开源程序利用UDP实现了可靠的数据传输:RUDP、RTP、UDT。
当下主要有这几个方案:主要是在应用层上通信协议的改写。
1.在应用层添加检测数据包的顺序、数据包的重复,发回确认帧。数据包的分包机制等等来保证可靠。
2.超时重传机制的引入,滑动窗口也可以。?未完待续

16.粘包如何解决

因为TCP属于流式套接字,TCP协议传输数据是将数据缓冲区里面的数据一起发送出去,而数据缓冲区里面的数据有可能就是很多个数据包汇总到一起的。在网络传输中有个最大传输单元,也就是1500字节,所以超过这个大小也需要分包传送。所以在客户端看来,因为TCP是流式协议,他便没有办法分辨发送过来是否是一个完整的包,也就是所谓的粘包现象。
解决方案:
1.每个包添加一个包含数据包长度的首部。
2.事先约定数据包长度,发送固定长度的包,不足补0,
3.使用分隔符号,在每个包尾部添加符号标识,这样接收端通过这个边界将包分开。

17.讲一下拥塞控制和流量控制

流量控制是端到端的控制,A向B发送数据,A发送得太快导致B来不及接受,从而A调整发送窗口,B调整接收窗口。原理就是通过滑动窗口来改变或实现。
拥塞控制主要是发送端主动调整发送策略的过程。当A.B两者之间的网络出现堵塞导致丢包,传输过慢,为了防止过多的数据注入到网络,发送端减小自己的发送包速率,并通过慢开始,快重传、快恢复等算法来控制发送速率。
在这里插入图片描述
快恢复以乘法减小之后连续收到三次重复的确认,便执行快恢复算法 。
在这里插入图片描述

18介绍下滑动窗口

首先,滑动窗口解决的是流量控制的问题。接收端根据自己的状况通告窗口大小,动态调整控制发送端的发送窗口大小,进行流量控制。
发送窗口的数据状态可以分为四类:
1.已经发送,已经收到ACK,下图左边界31字节
2.已经发送,但未收到ACK,下图32-45字节
3.可以发送,但还未发送,46-51
4.不可以发送,52之后
在这里插入图片描述

19.是否了解中间人劫持原理

20.http协议格式,几种方法,功能是什么

HTTP是基于TCP/IP协议的传输数据的超文本传输协议。
HTTP格式:
1.URL结构
统一资源标识符,包含了用于查找的资源足够的信息。一个RUL包含下面的几部分:

http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first
1.协议部分:http://
2.域名: www.fishbay.cn
3.端口: 80
4.文件名,锚,参数:/mix/76.html?name=kelvin&password=123456#

2.Request
HTTP的请求报文包括:请求行(request line)、请求头(header)、空行 和 请求数据(请求正文) 四个部分组成。
在这里插入图片描述
4.请求方法,常用的http请求方法:
GET:最常用的,用于请求访问资源,通过URI传参给服务器,读取数据。
POST:用于传输信息给服务器,主要用于上传文件、表单等。
PUT:传输文件,报文主体中包含文件内容,保存到对应的URI位置。
HEAD:获得报文首部,与GET方法类似,但是不请求资源的本文部分,只获取头部,资源的信息。一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反。
OPTIONS:查询URI支持的HTTP方法,测试服务器是否正常运作。
重点:GET与POST区别

GET请求实例:

GET http://weibo.com/signup/signup.php?inviteCode=2388493434 Host:
weibo.com Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

POST请求实例:

POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain Content-length: 18
item=bandsaw 2647

1.在请求数据的方式上:
GET请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。
POST请求会把请求的数据放置在HTTP请求包的包体中,也即是request body;
数据类型,GET只接受ASCII,而POST则没有限制。
2.在传输数据的大小上,GET方法会因为URL的长度而受到限制,一般浏览器限制为2K,而POST,理论上不会受到限制,但是实际上各个服务器会规定POST提交的数据大小进行限制。
3.安全性上,由于POST方法不经过URL,所以安全性比GET高。URL会暴露文件相关信息,很容易受(https://blog.csdn.net/ever_siyan/article/details/87935455)到某些网络攻击。GET会在网页中留下浏览痕迹,POST不会。
4.后退页面的反应
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交申请
只一点是因为:get请求允许缓存,而post请求不允许缓存。

5.重大区别(有一定的争议,不同环境所致)
GET产生一个TCP数据包,POST产生两个TCP数据包:
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
    GET 与 POST 详解

HTTP协议一次完整的工作流程:
一次HTTP操作称为一个事务,其工作过程大概如下:

1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;
2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;
3.在HTTP开始工作前,客户端首先会通过TCP/IP协议来和服务端建立链接(TCP三次握手)
4.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
5.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
6.一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

21.chunked块了解?介绍下

22.有chunked的时候contentlength是什么样子

23.三次握手四次握手详细过程,越详细越好

在这里插入图片描述

24.半连接在哪个阶段

在三次握手阶段,当服务器接收到连接请求,返回ACK应答之后,此时服务器就处于半连接状态,此时容易受到网络攻击。在四次挥手阶段,当客户端发送最后一次ACK应答之后客户端会进入到 2MSL 的TIME_WAIT状态,此时服务器就处于半连接状态。

25.libevent结构,内部实现

Libevent是一个典型的 Reactor 模式的同步 I/O 事件处理模式。它是一个最好的 Reactor 的成熟的事件驱动型网络库。
在这里插入图片描述
它的特点:
1.事件驱动,高性能
2.轻量级,专注于网络事件通知,
3.跨平台,支持windows、Linux、Mac os等
4.支持多种I/O复用技术,epoll/select/poll
5.主要针对 I/O,定时事件和信号事件

Libevent 库从安装,使用流程

26.tcp的可靠性体现在哪里

1.确认机制,一对一。
2.超时重传,确保信息送达。
3.滑动窗口解决流量控制,拥塞避免解决网络拥塞问题,慢开始,快恢复等机制一起保证TCP的通信状况。

27.ARP协议工作流程

28.指针与引用的区别

指针需要分配内存空间,引用是一个别名。
引用和指针的区别。本质上,引用是对象的别名,而指针是地址。
引用“&”,在创建的时候必须初始化,将其引用到一个有效的对象。其次,引用一旦初始化就不能被改变,即不能把其他对象再次赋给它,最后引用的创建和销毁不会调用类的构造和析构函数。
指针“*”,初始化分配内存空间,可以被任意改变指向的内存空间,销毁可用析构或者free、delete,然后在将指针置空,注意预防野指针。

29.Accept发生在三次握手哪个阶段

accept发生在三次握手之后。
第一次握手:客户端发送syn包(syn=j)到服务器。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。
三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。

30.UDP的接收缓冲区和发送缓冲区和TCP的区别

31.http长连接与短连接的区别

在HTTP/1.0中默认使用短连接。也即是客户端与服务器之间的每一次连接都会在任务结束之后断开,当有其他的请求来之后就重新建立一个http连接。而在HTTP/1.1之后,默认就使用长链接,即是当完成连接所传输的任务的时候,连接两端的TCP不会立马断开,而是会通过Connection:keep-alive该指令来保持一段时间的连接,这个时间可以设置。
长连接和短连接都有其相应的应用场景:长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,再次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

32.http和https区别

HTTP协议是一种使用明文数据传输的网络协议,但是它使用的明文式的URL资源定位符,容易暴露在网络中,所以在当下的互联网环境中,这显然是一个巨大的隐患。
所以HTTPS协议可以理解为HTTP协议的升级,只要就是在HTTP的基础上增加了数据加密,增大了安全性。

百度和谷歌两大搜索引擎都已经明确表示,HTTPS网站将会作为搜索排名的一个重要权重指标。也就是说HTTPS网站比起HTTP网站在搜索排名中更有优势。
HTTPS网站相比起HTTP网站拥有着多种的优势,HTTP明显已经不能适应当今这个互联网时代,可以预见到HTTP在不久的将来将会全面被HTTPS所取代。

33.udp包长度

局域网环境下:
以太网中数据帧的长度规定为1500字节,所以最大的数据帧不能超过这个大小。而TCP/UDP包在传输过程当中还需要在数据帧头添加20字节的网络层的IP包,同时TCP/UDP包头也需要添加一定字节的包头。所以最大长度如下:
UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
网络编程时:Internet编程时,将最大的MTU设定为不超过576字节,所以最好设置为548字节以内。
UDP 包的大小就应该是 576 - IP头(20) - UDP头(8) = 548(Bytes)
TCP 包的大小就应该是 576 - IP头(20) - TCP头(20) = 536 (Bytes)

34.一次url访问会经历哪些过程

https://www.editor.csdn.net/md?articleId=105973919
以此为例:一个URL包括
1.协议:https
2.网络地址:www.editor.csdn.net
3.资源路径:/md?articleId=105973919

35.数据包乱序会处理?

sequence number 作为数据包的序号,主要用来解决网络包乱序的问题,每次客户端与服务端交互时候的相互确认应答都会使得数据包序号加上传输的字节数,以此来保障数据包的顺序。同时,乱序一般是因为网络延迟等原因,并非丢包。但是两种情型都会造成乱序,一旦发生乱序或者丢包,会触发重传机制。
TCP利用这两种数据重传机制:1.超时重传2.快速重传。

36.seq为1000,发送了1000个数据,下一个seq是多少?

下一个seq = 2001;

37.syn如果丢了,重传多少次

服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户端确认包,进行第二次重传。如果重传的次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意每次等待的时间不一定相同,一般会是指数增长,列如间隔时间为1s,2s,4s,8s…

猜你喜欢

转载自blog.csdn.net/GJQJFJ/article/details/105973919