五层网络协议体系结构的理解

  • 1. 应用层

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。

  • 2. 运输层

运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。
由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。

  • 3. 网络层

在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP / IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。

  • 4. 数据链路层

数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如:同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。

  • 5. 物理层

在物理层上所传送的数据单位是比特。物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

ARP 协议的工作原理?

将ip地址转化为mac地址
网络层的 ARP 协议完成了 IP 地址与物理地址的映射。首先,每台主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP 列表中是否存在该 IP 地址对应的 MAC 地址:如果有,就直接将数据包发送到这个 MAC 地址;如果没有,就向本地网段发起一个 ARP 请求的广播包,查询此目的主机对应的 MAC 地址。
image.png
此 ARP 请求数据包里包括源主机的 IP 地址、硬件地址、以及目的主机的 IP 地址。网络中所有的主机收到这个 ARP 请求后,会检查数据包中的目的 IP 是否和自己的 IP 地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中,如果 ARP 表中已经存在该 IP 的信息,则将其覆盖,然后给源主机发送一个 ARP 响应数据包,告诉对方自己是它需要查找的 MAC 地址;源主机收到这个 ARP 响应数据包后,将得到的目的主机的 IP 地址和 MAC 地址添加到自己的 ARP 列表中,并利用此信息开始数据的传输。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

ARP攻击

arp攻击就是收到arp广播包之后,告诉他“我才是目的主机”,覆盖掉原本真正的目的主机的IP地址,这样你给目的主机发的消息都发到黑客哪里去了。

请回答OSI七层模型和TCP/IP四层模型,每层列举2个协议

OSI七层:应用层、会话层、表示层、传输层、网络层、数据链路层、物理层

  • 应用层:TCP:http、ftp、smtp、pop3、telnet UDP:dns、TFTP,dhcp
  • 传输层:tcp、udp
  • 网络层:ip、arp、ICMP、IGMP
  • 数据链路层:ppp协议

TCP/IP四层模型

应用层、传输层、网际层、网络接口层

常用端口

20: ftp-data端口
21: ftp
22:ssh
23:telnet
25:smtp
53:DNS
67、68:dhcp
80:http
110:pop3
443:https

TCP的三次握手和四次挥手的过程及原因

三次握手

微信图片_20191224114456.png

  • 第一次握手:客户端将SYN=1,seq=x。将该数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器确认。
  • 第二次握手:服务器收到数据报后,因为SYN=1,知道客户端请求建立连接,服务器将SYN、ACK=1,seq=k,ack=x+1,将数据报发送给客户端确认连接请求,服务器进入SYN_RCVD状态
  • 第三次握手:客户端收到确认后,检查ack是否是x+1,如果正确将ACK置位1,ack = k+1发送给服务器,服务器再检查,如果正确建立连接,两个都进入ESTABLISHED状态

序列号和确认号作用

序列号的作用是保证数据不会乱序
确认号的作用是确保不会丢失

请问tcp握手为什么两次不可以?为什么不用四次?

两次握手:当A客户端的请求在网络中滞留,如果是两次握手,就会建立连接,浪费资源。如果是三次连接,就知道这个滞留的不要了, (两次握手相当于server端不知道client端到底能不能“听到自己说话”)

四次握手:将SYN、ACK一起发送过去,节约一个步骤

Server 端收到 Client 端的 SYN 后,为什么还要传回 SYN

接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

传了 SYN,为什么还要传 ACK?

双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。

四次挥手

微信图片_20191224114505.jpg

  • 第一次挥手:客户端发送FIN=1,客户端进入FIN_WAIT_1状态。
  • 第二次挥手:服务器收到FIN之后,服务器进入CLOSE_WAIT状态,此时TCP处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
  • 第三次挥手:服务器发送FIN=1,服务器进入LAST_ACK状态。
  • 第四次挥手:客户端收到FIN后,客户端进入TIME_WIAT状态,发送ACK给服务器,服务器进入CLOSED状态,等待2MSL(最大报文存活时间),服务器没有反应,客户端关闭,完成四次挥手。
  • 为什么有TIME_WIAT状态:
  • 1.可靠的终止TCP连接,如果最后一个ACK丢失了,就要进行重发。
  • 2.保证迟来的报文有足够时间被识别并丢弃

为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

大量time_wait产生原因及解决办法

原因:爬虫服务器会产生大量的time_wait状态
解决:让服务器能够快速回收和重用那些TIME_WAIT的资源。

大量close_wait产生原因级解决办法

自动重传请求 ARQ 协议

自动重传请求分为3中,停等式ARQ,回退n帧ARQ,以及选择性重传ARQ

  1. 在停等式ARQ中,数据报文发送完成之后,发送方等待接收方的状态报告,如果状态报告报文发送成功,发送后续的数据报文,否则重传该报文。
  2. 在回退n帧的ARQ中,当发送方接收到接收方的状态报告指示报文出错后,发送方将重传过去的n个报文。
  3. 在选择性重传ARQ中,当发送方接收到接收方的状态报告指示报文出错,发送方只发送传送发生错误的报文。

三种ARQ协议中,复杂性递增,效率也递增。

滑动窗口

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。
微信图片_20200229113717.jpg

TCP协议如何来保证传输的可靠性

  • 数据包校验和:发送之前记性计算校验和,接收方收到之后也计算是不是一样的
  • 确认应答和序列号
  • 丢弃重复数据:对于重复数据丢弃
  • 超时重发:TCP发出一个报文后启动一个定时器,等待目的端确认收到这个报文。如果不能及时收到确认,将重发这个报文。
  1. 校验和
  2. 序列号与确认应答
  3. 丢弃重复数据
  4. 重发控制(超时重传)
  5. TCP将对收到的数据进行重新排序
  6. 流量控制、拥塞控制使得网络不好的时候丢包的概率大大减小

请你来说一下TCP流量控制

控制发送方的发送速率,使得接收方来得及接收。
接收方发送的确认报文中窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。

请你来说一下TCP拥塞控制

发送方维护一个拥塞窗口的状态变量cwnd

1. 慢开始和避免拥塞

令cwnd=1慢慢的加倍,变成2、4、8。。。
设置一个慢开始门限ssthresh,当cwnd>=ssthresh进入拥塞避免,每次cwnd+1
如果出现了超时,令ssthresh = cwnd/2,然后重新执行慢开始

2. 快重传和快恢复

在接收方,每次接受到的报文段应对最后一个已收到的有序报文段进行确认。
在发送方,如果收到三个重复确认,就知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段
然后执行快恢复,令ssthresh = cwnd/2 ,cwnd = ssthresh,此时进入避免拥塞

三次握手中,第二次握手丢失如何处理

三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

三次握手协议
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
半连接存活时间是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

SYN攻击

  1. 概念:伪造大量TCP连接请求,使得被攻击方资源耗尽
  2. 攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认并等待一段时间之后丢弃这个未完成的连接。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃
  3. 解决办法:
    1. 缩短超时(SYN Timeout)时间
    2. SYNCOOKIE技术:每个请求连接的IP地址分配一个Cookie,如果短时间内收到某个IP重复SYN报文,认定收到了攻击,这个IP地址来的包都被丢弃。

TCP与UDP的区别

  1. TCP是面向连接的,UDP是无连接的,所以udp发送的快一些
  2. TCP可靠,UDP不可靠,udp尽最大努力交付。
  3. TCP支持点对点通信、UDP支持一对一、一对多、多对一、多对多的通信模式
  4. TCP面向字节流,UDP面向报文
  5. TCP可以拥塞控制,UDP没有,所以udp可以更好控制发送时间和发送速度
  6. TCP首部(20个字节)比UDP首部(8字节)大
  7. tcp是全双工的

TCP可靠UDP不可靠,应用不同,udp应用于高速传输和实时性要求较高的通信

心跳机制(保活计时器)

当客户端和服务器建立了连接,如果客户端发生了故障,那么这个连接就没必要持续下去了。

服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75 秒钟发送一次。若连续发送 10个 探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。

TCP粘包

关于分包和粘包
粘包:发送方发送两个字符串”hello”+”world”,接收方却一次性接收到了”helloworld”.
分包:发送方发送字符串”helloworld”,接收方却接收到了两个字符串”hello”和”world”.
TCP为什么会分包
TCP是以段(Segment)为单位发送数据的,建立TCP链接后,有一个最大消息长度(MSS).如果应用层数据包超过MSS,就会把应用层数据包拆分,分成两个段来发送.这个时候接收端的应用层就要拼接这两个TCP包,才能正确处理数据.
TCP为什么会粘包

  • 发送方产生的粘包问题

有时候,TCP为了提高网络的利用率,会使用一个叫做Nagle的算法.该算法是指,发送端即使有要发送的数据,如果很少的话,会延迟发送.如果应用层给TCP传送数据很快的话,就会把两个应用层数据包“粘”在一起,TCP最后只发一个TCP数据包给接收端.

  • 接收方产生的粘包问题

接收方用户进程不及时接收数据,从而导致粘包现象
如何处理

  1. 特殊字符控制
  2. 在包头首都添加数据包的长度。
  3. 关闭nagle算法

tips:UDP 没有粘包问题,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包。传送的数据单位协议是 UDP 报文或用户数据报,发送的时候既不合并,也不拆分。
UDP保证可靠性:需要在应用层进行实现

HTTP返回码
HTTP请求结构:方法 URI 版本
HTTP响应结构:版本 状态码 短语

1XX:通知

  • 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。

    2XX:成功

    200 OK:请求成功,信息在返回的响应报文中
    204 No Content :响应头没有body数据
    206 Partial Content :表示客户端进行了范围请求,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分

    3XX:重定向

    301 Moved Permanently:永久重定向,比如访问http://www.baidu.com会转跳到https://www.baidu.com
    302 Found : 临时重定向,比如未登录的用户访问用户中心会重定向到登录界面。
    304 Not Modified:未修改(表示客户机缓存的版本是最新的,客户机应该继续使用它。)

    4XX:客户端错误

    400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解

  • 401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。

  • 403 Forbidden :请求被拒绝。

404 Not Found:请求的文档不再服务器上

5XX:服务端错误

502Bad GateWay:网关错误
503Service Unavailable:服务器不可用,服务器可能在维护或者暂停了。
504GateWay Time-Out:网关超时。
505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议的版本。

常见字段

connection:
Accept:客户端可接受数据类型
Accept-Encoding:客户端可以接受数据压缩方式

content-length:返回数据的长度
content-Type:返回数据的类型
content-Encoding:返回数据压缩方式

如何理解HTTP协议是无状态的

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。

常用的HTTP方法有哪些?

  • GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
  • POST:用于传输信息给服务器,提交数据,但一般推荐使用GET方式。
  • PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
  • HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
  • DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
  • OPTIONS:查询相应URI支持的HTTP方法。
  • PATCH:对资源进行部分修改。PUT 也可以用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改。
  • CONNECT:要求在与代理服务器通信时建立隧道。
  • TRACE:追踪路径。通常不会使用 TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪)。

HTTP请求报文与响应报文格式

请求报文包含四部分:
计网面试题总结 - 图5

  • a、请求行:包含请求方法、URI、HTTP版本信息
  • b、请求首部字段
  • c、请求内容实体
  • d、空行

响应报文包含四部分:
计网面试题总结 - 图6

  • a、状态行:包含HTTP版本、状态码、状态码的原因短语
  • b、响应首部字段
  • c、响应内容实体
  • d、空行

传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文

看ip数据报中协议表示字段,17是udp,6是tcp

GET和POST的区别

1、传送方式:get请求通过地址栏传输,post请求通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET产生一个TCP数据包;POST产生两个TCP数据包。
4、GET是幂等的,POST是不幂等的
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
幂等性:指的是多次执行相同的操作,结果是相同的
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
案例:
一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来

Cookie与Session的区别

因为http是无状态的,浏览器的每次请求都是新请求,所以引入了cookie机制 COOKIE机制是什么呢? 其实就是服务器给客户端返回数据的时候,中间加了一个标识, 然后客户端再次请求数据的时候,数据中带上这个标识, 那么服务器接收到请求消息时就知道这个请求来自于谁了
cookie键值都是字符串的类型,所有的cookie大小不能超过4K
cookie以文本格式存储在浏览器上,存储量有限,不安全;而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全,保存在服务器的内存当中,多了会给服务器造成很大的压力。

  1. cookie和session都是会话技术,cookie运行在客户端,session运行在服务端
  2. cookie大小不能超过4K,session没有大小限制
  3. cookie有安全隐患,在本地可以识别,session保存在服务器中更加安全
  4. session存在服务器的内存里面,过多会给服务器造成压力

从输入网址到获得页面的网络请求的过程,请详细说一下

1.DNS解析,完成域名到IP地址的转换

1.先从浏览器缓存里找IP,因为浏览器会缓存DNS记录一段时间
2.如没找到,再从Hosts文件查找是否有该域名和对应IP
3.如没找到,再从路由器缓存找
4.如没好到,再从DNS缓存查找
5.如果都没找到,浏览器域名服务器向根域名服务器(baidu.com)查找域名对应IP,还没找到就把请求转发到下一级,直到找到IP

2.TCP连接

3.客户端向web服务器发送HTTP请求

4.处理HTTP返回的响应

5.浏览器解析渲染页面

6.关闭连接

DNS 的解析过程?

  1. 主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的 IP 地址。
    2. 本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的 IP 地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的 IP 地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,本地域名服务器得到了所要解析的 IP 地址或报错,然后把这个结果返回给发起查询的主机。
    QQ图片20200408002052.jpg

上面试迭代查询,下面是递归查询

域名缓存

为了提高 DNS 查询效率,并减轻服务器的负荷和减少因特网上的 DNS 查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如:每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。
不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。

长连接短连接

HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头connnection字段加入keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。 长连接减少 了TCP连接中的重复建立连接和断开所造成的开销,减轻了服务器端的负载。

短连接没进行一次请求响应就会建立一次连接
在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。

http1.1和http1.0的区别

  1. 使用了长连接http1.0默认使用短连接,http1.1默认开启keep-alive使用长连接
  2. 增加了host字段
  3. 缓存处理(原来是If-Unmodified-Since,Expires来作为缓存判断的标准,引入了更多的缓存机制如Entity tag,If-Match)
  4. 带宽优化及网络连接(1.0中客户端如果只需要某个对象的一部分,服务器却将整个对象传过来了,并且不支持断点续传的功能)1.1在请求头引入了range头域,允许只请求资源的某个部分,返回码是206)
  5. 新增了一些错误通知状态码(409等)

http2.0的特点

  1. 多路复用,同一个连接可以并发处理多个请求,方法是把 HTTP数据包拆为多个帧,并发有序的发送,根据序号在另一端进行重组,而不需要一个个 HTTP请求顺序到达
  2. 首部压缩 减少header的大小,同时头信息和数据体都是二进制的,这样的数据占用空间更少;
  3. 支持服务器推送,就是服务端在 HTTP 请求到达后,除了返回数据之外,还推送了额外的内容给客户端;
  4. HTTP2.0 适用于 HTTPS 场景,因为其在 HTTP和 TCP 中间加了一层 SSL 层。

HTTPS 的工作过程?

20180831213616571.jpg
简化步骤如下:
1、客户端发起请求;
2、服务端返回证书;
3、客户端从验证证书得到服务端的公钥;
4、客户端生成随机数,并用公钥加密后发送给服务端;
5、服务器根据随机数生成对称密钥;
6、用对称密钥加密数据传输;

HTTP和HTTPS的区别,以及HTTPS有什么缺点

Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。
区别
HTTPS是加密传输协议,HTTP是名文传输协议,存在风险;
HTTP使用80端口 HTTPS使用的是443端口。
https通信需要SSL证书,证书一般需要向认证机构购买,http不需要
HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层

HTTPS 的优缺点?

  • 优点:
  1. 使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
    2. HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性;
    3. HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
  • 缺点:
  1. HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近 50%,增加 10% 到 20% 的耗电;
    2. HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
    3. SSL 证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用;
    4. SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗;
    5. HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。

对称加密、非对称加密

对称加密:加密解密用的是同一串秘钥

  • 优点
    简单快捷(加解密的效率高),密钥较短,且破译困难。
  • 缺点
    如果用户一旦多的话,管理密钥也是一种困难。不方便直接沟通的两个用户之间怎么确定密钥也需要考虑,这其中就会有密钥泄露的风险,以及存在更换密钥的需求。
  • 对称加密通常有 DES,AES 加密算法。

非对称加密:用公钥和私钥来加解密的算法。打个比方,A 的公钥加密过的东西只能通过 A 的私钥来解密;同理,A 的私钥加密过的东西只能通过 A 的公钥来解密。顾名思义,公钥是公开的,别人可以获取的到;私钥是私有的,只能自己拥有。

  • 缺点
    加解密比对称加密耗时.
  • 优点
    比对称加密安全.
  • 常用的非对称加密算法:RSA

什么是数字签名?

为了避免数据在传输过程中被替换,比如黑客修改了你的报文内容,但是你并不知道,所以我们让发送端做一个数字签名,把数据的摘要消息进行一个加密,比如 MD5,得到一个签名,和数据一起发送。然后接收端把数据摘要进行 MD5 加密,如果和签名一样,则说明数据确实是真的。

什么是数字证书?

对称加密中,双方使用公钥进行解密。虽然数字签名可以保证数据不被替换,但是数据是由公钥加密的,如果公钥也被替换,则仍然可以伪造数据,因为用户不知道对方提供的公钥其实是假的。所以为了保证发送方的公钥是真的,CA 证书机构会负责颁发一个证书,里面的公钥保证是真的,用户请求服务器时,服务器将证书发给用户,这个证书是经由系统内置证书的备案的。

I/O模型

select/poll/epoll
https://www.cnblogs.com/anker/p/3265058.html

SOCKET编程

image.png
服务器端
socket() 创建套接字 1.协议族信息 2.套接字类型3.最终采用的协议
bind() 将套接字和特定的IP地址绑定起来
listen() 监听该端口号 连接请求的队列长度,如果为6,表示队列中最多同时有6个连接请求
accept() 接受来自客户端的请求 包含客户端地址
write() 写数据
read() 读数据

  • send函数并不是直接将数据传输到网络中,而是负责将数据写入输出缓冲区,数据从输出缓冲区发送到目标主机是由TCP协议完成的。数据写入到输出缓冲区之后,send函数就可以返回了,数据是否发送出去,是否发送成功,何时到达目标主机,都不由它负责了,而是由协议负责。
  • recv函数也是一样的,它并不是直接从网络中获取数据,而是从输入缓冲区中读取数据。

客户端
socket() 创建套接字
connect() 建立连接 包含服务端的地址

详见https://www.cnblogs.com/helloworldcode/p/10610581.html

TCP send/recv 关闭是close
UDP sendto/recvfrom 关闭是closesocket

如何优雅的断开连接

close() / closesocket() 用来关闭套接字,将套接字描述符(或句柄)从内存清除,之后再也不能使用该套接字,与C语言中的 fclose() 类似。应用程序关闭套接字后,与该套接字相关的连接和缓存也失去了意义,TCP协议会自动触发关闭连接的操作。
shutdown() 用来关闭连接,而不是套接字,不管调用多少次 shutdown(),套接字依然存在,直到调用 close() / closesocket() 将套接字从内存清除。
调用 close()/closesocket() 关闭套接字时,或调用 shutdown() 关闭输出流时,都会向对方发送 FIN 包。FIN 包表示数据传输完毕,计算机收到 FIN 包就知道不会再有数据传送过来了。
默认情况下,close()/closesocket() 会立即向网络中发送FIN包,不管输出缓冲区中是否还有数据,而shutdown() 会等输出缓冲区中的数据传输完毕再发送FIN包。也就意味着,调用 close()/closesocket() 将丢失输出缓冲区中的数据,而调用 shutdown() 不会