计算机网络常见面试题

常见状态码及原因短语

  • HTTP请求结构: 请求方式 + 请求URI + 协议及其版本
  • HTTP响应结构: 状态码 + 原因短语 + 协议及其版本
  • 1×× : 请求处理中,请求已被接受,正在处理
  • 2×× : 请求成功,请求被成功处理
    200 OK
  • 3×× :重定向,要完成请求必须进行进一步处理
    301 :永久性转移
    302 :暂时性转移
    304 :所请求的资源未修改,服务器返回此状态码时,不会返回任何资源
  • 4××:客户端错误,请求不合法
    400:Bad Request,请求有语法问题
    401:请求要求用户的身份认证
    403:服务器理解请求客户端的请求,但是拒绝执行此请求
    404:客户端所访问的页面不存在
  • 5××:服务器端错误,服务器不能处理合法请求
    500:服务器内部错误
    502:充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
    503:服务器暂时的无法处理客户端的请求

计算机网络中各层传递的数据形式

  • 物理层:比特流

  • 数据链路层:帧

  • 网络层:数据报、分组

  • 传输层:数据段

  • 应用层:数据、消息

    总结:

    在每一层都有一个信息传输单元,叫信息分组(即上面提到的分组一般性的意思),每层具体的PDU叫法是由最初始的信息分组在各层经过封装后形成的。进入应用层加上应用层的报头后成为最初始的信息分组,叫信息,由传输层提供报文交付(下层为上层服务),应用层报文传到传输层。进入传输层,报文被分割固定长度,加上传输层报头,成为数据段。数据段向下传到网络层,加上网络层报头,包含路由信息,成为分组或数据报,网络层实现分组交付。继续向下传输,进入数据链路层,加上数据链路层头部和尾部,形成,将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。进入物理层,将数据转换成物理链路中模拟量即bit进行传输。到达接收端是一个相反的过程。

TCP三次握手和四次挥手

三次握手

jw3

jw4

三次握手

  • 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
  • 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
  • 客户端–发送带有 ACK 标志的数据包–三次握手–服务端

四次挥手

jw5

四次挥手

断开一个 TCP 连接则需要“四次挥手”:

  • 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送。
  • 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号。
  • 服务器-关闭与客户端的连接,发送一个FIN给客户端。
  • 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1。

为什么TCP需要三次握手,四次挥手?

为什么需要三次握手?

“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”

client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后

的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为

是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,

那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server

的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,

server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不

会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。主要目的防止server端一直等待,浪费资源。

为什么需要四次挥手?

因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是4次。

为什么在TCP连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢?

因为tcp是全双工模式接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。

为什么四次挥手最后需要2MSL的TIME-WAIT时间,才进入CLOSED状态?

第一、为了保证发送方发送的最后一个ACK报文段能够到达接收方。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的接收方收不到对已发送的FIN+ACK报文段的确认接收方会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。

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

TCP和UDP有什么区别?

UDP的主要特点

  1. UDP是无连接的;
  2. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
  3. UDP是面向报文的;
  4. UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);
  5. UDP支持一对一、一对多、多对一和多对多的交互通信
  6. UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

TCP的主要特点

  1. TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
  2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)
  3. TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
  4. TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
  5. TCP是面向字节流的。TCP中的“流”(stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

jw1

1). TCP对应的应用层协议

  • FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。
  • Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。
  • SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。
  • POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。
  • HTTP:从Web服务器传输超文本到本地浏览器的传送协议。

2). UDP对应的应用层协议

  • DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
  • SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
  • TFTP(Trival File Transfer Protocal):简单文件传输协议,该协议在熟知端口69上使用UDP服务。

交换机和路由器有什么区别?

①工作所处的OSI层次不一样,交换机工作在OSI第二层数据链路层,路由器工作在OSI第三层网络层

②寻址方式不同:交换机根据MAC地址寻址,路由器根据IP地址寻址

③转发速不同:交换机的转发速度快,路由器转发速度相对较慢

交换机、路由器、网关、网桥的概念及各自用途?

  • 交换机用于局域网,利用主机的 MAC 地址进行数据传输,而不需要关心 IP 数据包中的 IP 地址,它工作于数据链路层
  • 路由器识别网络是通过 IP 数据包中 IP 地址的网络号进行的,所以为了保证数据包路由的正确性,每个网络都必须有一个唯一的网络号。路由器通过 IP 数据包的 IP 地址进行路由选择的(将数据包递交给哪个下一跳路由器),路由器工作于网络层
  • 网关就是连接两个网络的设备,能在不同协议间移动数据。作用于网络层以上。
  • 网桥是一个局域网与另一个局域网之间建立连接的桥梁。属于数据链路层的一种设备。

ARP是地址解析协议,简单语言解释一下工作原理。

ARP协议:通过目的的IP地址来获取MAC地址。

  1. 首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
  2. 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。
  3. 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
  4. 源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

注意:广播发送ARP请求,单播发送ARP响应。

ICMP协议?

ICMP是InternetControl Message Protocol,因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP报文有两种:差错报告报文和询问报文。

DHCP协议?

动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

HTTP的长连接和短连接?

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议。

短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭。如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

TCP短连接: client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。短连接一般只会在 client/server间传递一次读写操作。

TCP长连接: client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

为什么TIME_WAIT状态还需要等2MSL(Max SegmentLifetime,最大分段生存期)秒之后才能返回到CLOSED状态呢?

因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SENT状态到ESTABLISH状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文。所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文

IO中同步与异步,阻塞与非阻塞区别

同步和异步关注的是消息通信机制 (synchronous communication/asynchronous communication)
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由调用者主动等待这个调用的结果。
异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

IP地址的分类

IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。全0和全1的都保留不用。(全0表示网络地址,全1表示广播地址)
A类:第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
B类:前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
C类:前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。
D类地址:以1110开头,第一个字节范围为224~239;多播地址
E类地址:以1111开头,保留今后使用
网络号(net-id):标记主机(或路由器)所连接的网络;主机号(host-id):标记主机(或路由器)。

IP地址与子网掩码相与得到网络号。

TCP/IP中,各层协议的简单介绍?

  • 数据链路层:PPP协议(点对点协议),SCMA/CD (带冲突检测的载波监听多路访问技术)

  • 网络层:IP协议、ICMP协议(网际控制报文协议)、IGMP(网际组管理协议)、ARP协议、RARP协议,OSPF(开放路径最短优先协议)。
    ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。

  • 传输层:UDP协议、TCP协议。

  • 应用层:FTP(文件传送协议)、Telenet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议。
    TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
    HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
    NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术。

    DHCP协议(动态主机配置协议):一个局域网的网络协议,使用UDP协议工作。用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

在浏览器中输入www.baidu.com后执行的全部过程?

  1. 浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件、检查路由器缓存和向本地DNS服务器进行查询(搜索本地DNS服务器缓存)等。对于向本地DNS服务器进行查询,如果要查询的域名由本地DNS服务器区域解析,则返回解析结果给客户机,完成域名解析(此解析具有权威性)如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询
  2. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手
  3. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求
  4. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器
  5. 浏览器解析并渲染视图,如果遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤,向服务器请求这些资源;
  6. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面;
  7. 浏览器向服务器(目的主机)发起四次挥手,请求断开连接。

jw2

DNS的工作原理?

  1. 应用进程将待解析的域名放在DNS请求报文中,以UDP数据报的形式发送给本地域名服务器,本地域名服务器查找到相应域名的IP地址后(主机向本地域名服务器的查询一般都是采用递归查询),就将该域名的IP地址信息放入应答报文中返回给客户进程。
  2. 如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他域名服务器继续发送查询请求报文(本地域名服务器向根域名服务器的查询通常采用迭代查询)。
  3. 当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器查询”。然后让本地域名服务器进行后续的查询。

Cookie和Session的区别

概述

  1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
  2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
  3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。
  4. 所以,总结一下:
    Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中。
    Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

总结

  1. session 在服务器端,cookie 在客户端(浏览器)
  2. session 默认被存在在服务器的一个文件里(不是内存)
  3. session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
  4. session 可以放在文件、数据库、或内存中都可以。
  5. 用户验证这种场合一般会用 session

论述

一、cookie和session

cookie和session都是用来跟踪浏览器用户身份的会话方式。

区别:

1、保持状态:cookie保存在浏览器端,session保存在服务器端

2、使用方式:

(1)cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie。如果在浏览器中设置了cookie的过期时间,cookie被保存在硬盘中,关闭浏览器后,cookie数据仍然存在,直到过期时间结束才消失。Cookie是服务器发给客户端的特殊信息,cookie是以文本的方式保存在客户端,由对服务器的请求来传递,每次都会携带在HTTP请求头中,如果使用cookie保存过多数据会带来性能问题。

(2)session机制:当服务器收到请求需要创建session对象时,首先会检查客户端请求中是否包含sessionid。如果有sessionid,服务器将根据该id返回对应session对象。如果客户端请求中没有sessionid,服务器会创建新的session对象,并把sessionid在本次响应中返回给客户端。通常使用cookie方式存储sessionid到客户端,在交互中浏览器按照规则将sessionid发送给服务器。如果用户禁用cookie,则要使用URL重写,可以通过response.encodeURL(url) 进行实现;API对encodeURL的结束为,当浏览器支持Cookie时,url不做任何处理;当浏览器不支持Cookie的时候,将会重写URL将SessionID拼接到访问地址后。

3、存储内容:cookie只能保存字符串类型,以文本的方式;session通过类似与Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)

4、存储的大小:cookie:单个cookie保存的数据不能超过4kb;session大小没有限制。

5、安全性:cookie:针对cookie所存在的攻击:Cookie欺骗,Cookie截获;session的安全性大于cookie。

原因如下:

(1)sessionID存储在cookie中,若要攻破session首先要攻破cookie;

(2)sessionID是要有人登录,或者启动session_start才会有,所以攻破cookie也不一定能得到sessionID;

(3)第二次启动session_start后,前一次的sessionID就是失效了,session过期后,sessionID也随之失效。

(4)sessionID是加密的

(5)综上所述,攻击者必须在短时间内攻破加密的sessionID,这很难。

6、应用场景:

cookie:

(1)判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。

(2)保存上次登录的时间等信息。

(3)保存上次查看的页面

(4)浏览计数

jw11

session:Session用于保存每个用户的专用信息,变量的值保存在服务器端,通过SessionID来区分不同的客户。

(1)网上商城中的购物车

(2)保存用户登录信息

(3)将某些数据放入session中,供同一用户的不同页面使用

(4)防止用户非法登录

7、缺点:

cookie:

  • 大小受限

  • 用户可以操作(禁用)cookie,使功能受限

  • 安全性较低
  • 有些状态不可能保存在客户端。
  • 每次访问都要传送cookie给服务器,浪费带宽。
  • cookie数据有路径(path)的概念,可以限制cookie只属于某个路径下。

session:

  • Session保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站,服务器的内存压力会比较大。

  • 依赖于cookie(sessionID保存在cookie),如果禁用cookie,则要使用URL重写,不安全。

  • 创建Session变量有很大的随意性,可随时调用,不需要开发者做精确地处理,所以,过度使用session变量将会导致代码不可读而且不好维护。

下面是关于Cookie生命周期的介绍:

Cookie如果不设置过期时间(使用setMaxAge()方法),则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器还有不同的处理方式。

HTTPS的实现原理

废话一下:其实我也不知道自己理解的是不是对的,我觉得网上很多讲Https原理的文章其实本质上讲的都是SSL/TLS的原理。在我看来,Https指的是Http协议+ SSL/TLS协议,也就是说,Http协议本来定义了数据的包装方式(要包含请求头,请求方式等),现在在这个基础上,还要求行对数据进行加密,对通信双方身份进行验证(如何加密,如何验证由SSL决定)。 我也不知道我理解的对不对?求高人赐教。

jw6

下面上图:

jw7

jw8

补充:

非对称加密:

非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。

比如说: 我有一对密钥,一个是公钥(假设是’a’),一个是私钥(假设是’b’),现在我用’a’对一个内容加了密,那么,此时,,你只有用私钥’b’对它进行解密才能看到正确内容。同理,如果我用私钥’b’加了密,你只有用公钥’a’解密才能看到内容。

对称加密:

对称密钥加密(英语:Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。

对称加密其实就是说: 比如我用’a’作为密钥对内容加了密,你必须也得用’a’作为密钥对加密后的内容进行解密。

HTTP协议

特点

1.HTTP协议是无状态的

​ 就是说每次HTTP请求都是独立的,任何两个请求之间没有什么必然的联系。但是在实际应用当中并不是完全这样的,引入了Cookie和Session机制来关联请求。

2.多次HTTP请求

  在客户端请求网页时多数情况下并不是一次请求就能成功的,服务端首先是响应HTML页面,然后浏览器收到响应之后发现HTML页面还引用了其他的资源,例如,CSS,JS文件,图片等等,还会自动发送HTTP请求这些需要的资源。现在的HTTP版本支持管道机制,可以同时请求和响应多个请求,大大提高了效率。

3.基于TCP协议

  HTTP协议目的是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。底层是基于TCP实现的。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。

HTTP报文

请求报文

jw9

1
2
3
4
5
6
7
8
9
10
11
GET /wxisme HTTP/1.1  
Host: www.cnblogs.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45
Cache-Control: max-age=0

响应报文

jw10

1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK
Date: Tue, 12 Jul 2016 21:36:12 GMT
Content-Length: 563
Content-Type: text/html

<html>
<body>
Hello http!
</body>
</html>
秉持初心,继续向前。
显示 Gitment 评论