文章目录
- 计算机网络相关知识点整理:
- 1. OSI,TCP/IP,五层协议的体系结构,以及各层协议?
- 2. TCP 和 UDP 是什么?简述它们有什么区别?
- 3. 请描述 TCP 三次握手的过程, 为什么要三次握手?
- 4. 请描述 TCP 四次分手的过程, 为什么需要四次分手?
- 5. 四次分手过程中为什么等待 2MSL?
- 6. TCP 粘包是怎么回事,如何处理?UDP 有粘包吗?
- 7. time_wait 是什么情况?出现过多的 close_wait 可能是什么原因?
- 8. select, poll, epoll 的区别?边缘触发,水平触发区别?
- 9. 简述一下你了解的端口及对应的服务。(至少5 个)
- 10. HTTP 协议是什么?工作原理是什么?
- 11. HTTP 报文结构
- 12. GET 和 POST 请求的区别
- 13. HTTP 常见的状态码有哪些? 301,302,404,500,502,504 等
- 14. HTTP 与 HTTPS 的区别是什么?
- 15. 在浏览器中输入www.baidu.com 后执行的全部过程。
- 16. 常用加密算法及原理
计算机网络相关知识点整理:
1. OSI,TCP/IP,五层协议的体系结构,以及各层协议?
- OSI:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- TCP/IP:网络接口层、网际层、运输层、应用层
- 五层协议:物理层、数据链路层、网络层、传输层、应用层
数据单元 | 设备 | 协议 | 功能 | |
---|---|---|---|---|
物理层 | 比特 bit | 中继器、集线器、网关 | RJ45、CLOCK、IEEE802.3 | 通过媒介传输比特,确定机械及电气规范 |
数据链路层 | 帧 frame | 网桥、交换机 | PPP、FR、HDLC、VLAN、MAC | 将比特组装成帧和点到点的传递 |
网络层 | 包 packet | 路由器 | IP、ICMP、ARP、RARP、IGMP、OSPF、IPX、RIP | 负责数据包从源到宿的传递和网际互联 |
传输层 | 段 segment | 进程、端口(socket) | TCP、UDP | 提供端到端的可靠报文传递和错误恢复 |
会话层 | SPDU | 服务器验证用户登陆、断点续传 | NFS、SQL、NETBIOS、RPC | 建立、管理和终止会话 |
表示层 | PPDU | URL加密、口令加密、图片编解码 | JPEG、MPEG、ASII | 对数据进行翻译、加密和压缩 |
应用层 | APDU | – | FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS | 允许访问OSI环境的手段 |
2. TCP 和 UDP 是什么?简述它们有什么区别?
首先, TCP 和 UDP 都是传输层的协议
- TCP:传输控制协议,是一种
面向连接的可靠传输
协议。 - UDP:用户数据报协议,是一种
非面向连接的不可靠传输
协议。, - 其中,面向连接:传输前进行沟通和协商,确保互相可以/愿意发送数据;非面向连接:发送数据,收不收无所谓,传输数据之前源端和目的端不需要建立连接,不需要维护连接状态,转发状态等。
TCP与UDP区别总结:
- TCP面向连接;UDP面向无连接的
- TCP提供可靠的服务;UDP尽最大努力交付,即不保证可靠交付
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
- TCP连接只能是点对点的;UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
- TCP具有拥塞控制;UDP没有拥塞控制,因此当网络出现拥塞时不会使源主机的发送速率降低 (这对实时应用很有用,如IP电话,实时视频会议等)
3. 请描述 TCP 三次握手的过程, 为什么要三次握手?
三次握手的过程:
- 第一次握手:建立连接时,客户端发送 SYN=J 包到服务器,并且客户端进入 SYN_SENT 状态,等待服务器确认(SYN,同步序列编号)
- 第二次握手:服务器收到 SYN=J 包,会发送 SYN+ACK 包给客户端,其中,ACK 为确认包 (ACK=J+1),同时服务器会发送自己的 SYN=K 包,此时,服务器进入 SYN_RECV状态
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK=K+1,此包发送完毕,客户端和服务器进入ESTABLISHED (TCP连接成功) 状态,完成三次握手
为什么TCP需要三次握手?
总的来说,两次不可靠,四次不高效。TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率,而且三次握手可以保证任何一次握手出现问题,都是可以被发现或补救的。
-
如果是两次握手:
在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。 现假定出现一种异常情况,即客户端发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达服务端。本来这是一个早已失效的报文段。但服务端收到此失效的连接请求报文段后,就误认为客户端又发出一次新的连接请求。于是就向客户端发出确认报文段,同意建立连接。假定不采用三次握手,那么只要服务端发出确认后,新的连接便建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务端的确认,也不会向服务端发送数据。但服务端却以为新的运输连接已经建立了,并一直等待客户端发来数据。服务端的许多资源就这样白白浪费。采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,客户端不会向服务端的确认发出确认。服务端由于收不到确认,就知道客户端并没有要求建立连接。 -
如果是4次及以上的握手:
三次握手之后,客户端和服务端可以保证正常通信,之后的次数都是徒劳没有必要,三次握手是可以建立链接的最少次数,节约资源使传输更加高效。
4. 请描述 TCP 四次分手的过程, 为什么需要四次分手?
四次分手的过程:
- 客户端关闭到服务端的连接,所以客户端发送一个 FIN 包,并且客户端进入 FIN_WAIT1 状态
- 服务器收到FIN 包,会向客户端发送一个 ACK 包,确认序号为收到的序号加1。此时,服务端进入 CLOSE_WAIT 状态,收到 ACK 的客户端会进入 FIN_WAIT2 状态
- 服务器关闭到客户端的连接,所以服务端发送一个 FIN 包 给客户端,并且==服务端进入 LAST_ACK ==状态
- 客户端收到该 FIN 包会进入 TIME_WAIT 状态,并向服务端发回 ACK 报文确认,收到 ACK 后服务端进入 CLOSED 状态,等待2MSL 时间后无任何响应,客户端进入 CLOSED 状态
为什么断开需要四次?
TCP是全双工模式的,这就意味着,当客户端发出 FIN 报文段后,只是表示客户端已经没有数据要发送了;但是,这个时候客户端还是可以接受来自服务器的数据;当服务端返回 ACK 报文段时,表示它已经知道客户端没有数据要发送了,但是服务端还是可以发送数据到客户端的;当服务端也发送了 FIN 报文段后,这个时候就表示服务端也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
5. 四次分手过程中为什么等待 2MSL?
首先,什么是 2MSL?
2MSL 即两倍的 MSL。
MSL(Maximum Segment Lifetime, 报文最大生存时间):任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
因为 tcp 报文是 ip 数据报的数据部分,而 ip 头中有一个 TTL 域,TTL(time to live, 生存时间) 是由源主机设置的初始值并不是存的具体时间,是存储了一个 ip 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃
,同时发送 ICMP 报文通知源主机。
RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
TTL 与 MSL 是有关系的但不是简单的相等的关系,MSL 要大于等于TTL。
然后,为什么要等待?为什么不直接关闭要进入等待状态?
- 保证客户端发送的 ACK 报文段能够到达服务器,从而保证tcp连接能够进行可靠的关闭。
如果客户端发动 ACK 后就立刻关闭,如果 ACK 丢失,服务端就会一直处于 LAST_ACK 的状态,等待超时后再发送关闭请求时,此时的客户端已经关闭,那么服务端就无法进行正常的关闭了。 - 保证此次连接的数据段消失,防止失效的数据段。
客户端在发送 ACK 后,再等待 2MSL 时间,可以保证本次连接所产生的数据段从网络中消失,从而保证关闭连接后不会有还在网络中滞留的数据段去骚扰服务端
最后,为什么是 2MSL?
服务端收到 ACK 后会关闭连接,但是客户端无法知道自己的ACK是否已经到达服务端,于是开始等待?等待什么呢?假如ACK没有到达服务端,服务端会为 FIN 这个消息超时重传 timeout retransmit ,即客户端等待时间足够,“又”收到FIN消息,也就说明 ACK 没有到达服务端,于是客户端再发送 ACK,直到在足够的时间内没有收到 FIN,说明 ACK 成功到达。所以这个等待时间至少是:服务端的 timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间 2MSL。
6. TCP 粘包是怎么回事,如何处理?UDP 有粘包吗?
首先,了解 TCP 中的传输机制
- 流式套接字
TCP基于流式套接字,指TCP的数据传输跟流动的水一样没有界限。 - 缓存机制
TCP发送数据,并不是应用程序 send 以后就立即发出去,它是先存储在发送缓冲区中,为了性能的考虑,可能会等到多个数据包汇总到一起后,操作系统底层再把缓冲区整体发送出去,接收数据也是一样的。 - 最大传输单元
在网络传输中,有个MTU-最大传输单元,是1500个字节,就是说每一次发送最多只能发送1500个字节,如果要发送超过这个长度的数据包,就需要分包发送。
然后,TCP粘包是什么?
基于 TCP 在数据传输中存在的三种机制,发送方发送的若干包数据到达接收方时可能会粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。
那么,如何解决粘包?
约定数据包长度
,即发送端和接收端约定一样的发送和接收的数据包长度,这样可以清晰的获取到我们需要的数据使用分隔符
,比如 smtp 协议就是在发送时,使用 \r\n 为分隔符,但如果发送的数据中也有 \r\n ,就容易搞混淆在每个数据包的开头利用2个或者4个字节描述整个数据包的长度
,接收端可以先接收2个或者4个字节,就可准确的知道真正的数据包是多长,从而正确获取需要的数据
最后,UDP 有粘包嘛?
- TCP基于流的传输,保证可靠传输并减少额外的开销,基于流的传输不认为消息是一条一条的,是
无保护消息边界
的。 - UDP是面向消息传输的,是
有保护消息边界
的,传输协议把数据当做一条独立的消息在网上传输,接收方一次只接受一条独立的信息,所以不存在粘包问题。
7. time_wait 是什么情况?出现过多的 close_wait 可能是什么原因?
time_wait 状态的作用:
- 保证客户端发送的 ACK 报文段能够到达服务器,从而保证tcp连接能够进行可靠的关闭。
如果客户端发动 ACK 后就立刻关闭,如果 ACK 丢失,服务端就会一直处于 LAST_ACK 的状态,等待超时后再发送关闭请求时,此时的客户端已经关闭,那么服务端就无法进行正常的关闭了。 - 保证此次连接的数据段消失,防止失效的数据段影响新连接。
客户端在发送 ACK 后,再等待 2MSL 时间,可以保证本次连接所产生的数据段从网络中消失,从而保证关闭连接后不会有还在网络中滞留的数据段去骚扰服务端
大量 time_wait 的原因:
在高并发短连接
的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接,这个场景下会出现大量 socket 处于TIME_WAIT的状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。
大量 close_wait 的原因:
close_wait:关闭 TCP 连接过程中,第 1 次挥手服务器接收客户端的 FIN 报文段,第 2 次挥手时,服务器发送了 ACK 报文段之后,服务器会进入 close_wait 状态。
究其原因是:
- 程序问题:即服务器端的代码,没有及时调用 close 函数关闭 socket 连接,也就不会发出 FIN 报文段;或者出现死循环,服务器端的代码永远执行不到 close。
- 客户机响应太慢或者客户端的 FIN 消息的超时重传 timeout 设置过小
8. select, poll, epoll 的区别?边缘触发,水平触发区别?
首先,什么是 select, poll, epoll?
select,poll,epoll是IO多路复用的机制。
I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
IO多路复用适用如下场合:
- 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
- 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
- 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
- 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
- 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
I/O多路复用的技术优势:与多进程和多线程技术相比,系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
select,poll,epoll
本质上都是同步I/O
,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
其次, select, poll, epoll 之间的区别在于:
-
select 机制:准许进程指示内核等待多个事件中的任何一个发生,并通过
无差别轮询
在有一个或多个事件发生或经历一段指定的时间后唤醒(解阻塞),本质上是通过设置或者检查存放 fd 标志位的数据结构来进行下一步处理。
select 优点:良好的跨平台性,几乎所有的平台都支持
select 缺点:
1). 单个进程可监视的套接字数量被限制,即能监听端口的大小有限。一般来说这个数目和系统内存关系很大,32位机默认是1024个。64位机默认是2048.具体数目可以
cat /proc/sys/fs/file-max
查看。2). 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低
当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。
3). 需要维护一个用来存放大量 fd 的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
-
poll 机制:与 select 在本质上没有多大差别,管理多个描述符也是进行
轮询
,根据描述符的状态进行处理。它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有 fd 后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。
poll 优点:没有最大连接数限制,原因是基于链表来存储的
poll 缺点:
1). 包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
2). poll 是“水平触发”的,如果报告了 fd 后,没有被处理,那么下次poll时会再次报告该 fd。 -
epoll 机制:是在 2.6 内核中提出的,相对于 select 和 poll ,epoll 更加灵活,
没有描述符限制
,基于事件通知机制
。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll 优点:
1). 没有最大并发连接的限制,(1G的内存上能监听约10万个端口)
2). 效率提升,基于事件通知机制非轮询的方式,不会随着 fd 数目的增加效率下降。只有活跃可用的 fd 才会调用 callback 函数,即epoll最大的优点在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。
3). 内存拷贝,epoll通过内核和用户空间共享一块内存来实现的。利用 mmap() 文件映射内存加速与内核空间的消息传递,即 epoll 使用mmap减少复制开销。
综上,在选择select,poll,epoll 时要根据具体的使用场合以及这三种方式的自身特点。
- 表面上看 epoll 的性能最好,但是在连接数少并且连接都十分活跃的情况下,select 和 poll 的性能可能比 epoll 好,毕竟 epoll 的通知机制需要很多函数回调。
- select 低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
水平触发、边缘触发的区别:
如果文件描述符自上次状态改变后有新的事件发生,此时会触发通知。在linux的 IO 多路复用中有水平触发,边缘触发两种模式
水平触发:处理完成才会停止通知
。当检测到文件描述符有事件发生并将该事件通知应用程序,如果应用程序不立即对其进行处理,它不会将事件丢弃,它将会一直提示。select,poll就属于水平触发。
边缘触发:一次通知
。在收到一个 IO 事件通知后要尽可能多的执行 IO 操作,因为如果在一次通知中没有执行完 IO 那么就需要等到下一次新的 IO 活动到来才能获取到就绪的描述符。epoll既可以采用水平触发,也可以采用边缘触发;信号驱动式IO就属于边缘触发。
另一角度理解水平触发和边缘触发的区别:
水平触发:在高电平(1)或低电平(0)时触发通知,只要在这两种状态就能得到通知。
边缘触发:在电平发生变化 (高电平到低电平,或者低电平到高电平) 的时候触发通知。
【使用场景注意】
- 在写 epoll 网络模型时,如用水平触发不用担心数据有没有读完因为下次 epoll 返回时,没有读完的 socket 依然会被返回,但是每次 socket 可写时epoll都会返回,当写的数据包过大时,一次写不完,要多次才能写完,每次写都会被 epoll 检测到,因此长期关注 socket 写事件会无故 cpu 消耗过大甚至导致 cpu 跑满,所以在水平触发模式下我们一般不关注socket可写事件而是通过调用 socket write 或者 send api 函数来写socket,因此在模式的效率上
水平触发没有边缘触发高
- 边缘触发模式下在读数据时一定要注意,因为如果一次可写事件没有把数据读完,在 socket 没有新的数据可读时 epoll 就不会返回了,只有在新的数据到来时,我们才能读取到上次没有读完的数据。
9. 简述一下你了解的端口及对应的服务。(至少5 个)
首先,认识端口的分类:
按端口号分布划分
-
知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。 -
动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。在关闭程序进程后,就会释放所占用的端口号。
其次,如何查看端口?
netstat -an
'''
-a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。
-e 表示显示以太网发送和接收的字节数、数据包数等。
-n 表示只以数字形式显示所有活动的TCP连接的地址和端口号。
-o 表示显示活动的TCP连接幷包括每个连接的进程ID(PID)。
-s 表示按协议显示各种连接的统计信息,包括端口号。
'''
最后,常见的端口及对应服务有:
- 21端口:FTP(File Transfer Protocol,文件传输协议)服务
- 22端口:SSH(Secure SHell),使用SSH将所有传输的数据进行加密
- 23端口:Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程序。
- 25端口:SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。
- 53端口:DNS(Domain Name Server,域名服务器)服务器所开放,主要用于域名解析,DNS服务在NT系统中使用的最为广泛。
- 67、68端口:分别是为Bootp服务的Bootstrap Protocol Server(引导程序协议服务端)和Bootstrap Protocol Client(引导程序协议客户端)开放的端口。
- 69端口:TFTP服务,是Cisco公司开发的一个简单文件传输协议,类似于FTP。
- 80端口:HTTP(HyperText Transport Protocol,超文本传输协议),主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议。
- 109、110端口:POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,POP3(邮件协议3)服务,POP2、POP3都是主要用于接收邮件的。
- 111端口:SUN公司的RPC(Remote Procedure Call,远程过程调用)服务所开放的端口,主要用于分布式系统中不同计算机的内部进程通信,RPC在多种网络服务中都是很重要的组件。
- 113端口:主要用于Windows的“Authentication Service”(验证服务)。
- 119端口:为“Network News Transfer Protocol”(网络新闻组传输协议,简称NNTP)开放的。
- 135端口:主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务。
- 137端口:主要用于“NetBIOS Name Service”(NetBIOS名称服务)。
- 139端口:是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。
- 143端口:主要是用于“Internet Message Access Protocol”v2(Internet消息访问协议,简称IMAP)。
- 161端口:用于“Simple Network Management Protocol”(简单网络管理协议,简称SNMP)。
- 443端口:即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。
- 554端口:默认情况下用于“Real Time Streaming Protocol”(实时流协议,简称RTSP)。
- 1024端口:一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。
- 1080端口:是Socks代理服务使用的端口,大家平时上网使用的WWW服务使用的是HTTP协议的代理服务。
- 4000端口:用于大家经常使用的QQ聊天工具的,再细说就是为QQ客户端开放的端口,QQ服务端使用的端口是8000。
- 8080端口:同80端口,是被用于WWW代理服务的,可以实现网页
10. HTTP 协议是什么?工作原理是什么?
首先,HTTP 协议是什么?
HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP是客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
然后,HTTP 的工作原理:
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据;服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 请求/响应的一般步骤:
-
客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。 -
发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。 -
服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。 -
释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。 -
客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
HTTP协议的基本特性:
- 基于TCP/IP协议之上的应用层协议。
- 基于“请求-响应”的模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。 - 媒体独立的
只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。 - 无状态协议
HTTP协议自身不对请求和响应之间的通信状态进行保存,不做持久化处理。使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。但是,随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。 - 无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次响应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。
11. HTTP 报文结构
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
12. GET 和 POST 请求的区别
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
- HTTP1.0 定义了三种请求方法: GET、POST 和 HEAD方法。
- HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
主要区别在于:
- GET 是从服务器上获取数据,POST 是向服务器传送数据。
- GET 是不安全的,传输过程中会将请求参数放在请求的 URL 中;POST 请求参数在请求体当中,包含在
Content-Type
消息头里,指明该消息体的媒体类型和编码,操作是对用户不可见的。 - GET 传送的数据量小,受 URL 长度的限制;POST 传输的数据量较大,被默认为不受限制(比如请求中包含许多参数或者文件上传操作等)。
- GET在浏览器回退是无害的;POST 需要再次提交请求。
- 参数的数据类型,GET 只接受 ASII 编码;POST无限制。
13. HTTP 常见的状态码有哪些? 301,302,404,500,502,504 等
首先,认识状态码的分类
HTTP状态码共分为5种类型:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的状态码:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
14. HTTP 与 HTTPS 的区别是什么?
详细的介绍博文推荐:https://www.cnblogs.com/shoshana-kong/p/10583760.html
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP 的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS 协议的主要作用:
- 一是建立一个信息安全通道,来保证数据传输的安全;
- 二是确认网站的真实性。
HTTPS 和 HTTP 的区别主要如下:
-
https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
-
http是超文本传输协议,
信息是明文传输
,https 则是具有安全性的ssl 加密传输协议
。 -
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是
80
,后者是443
。 -
http的连接很简单,是
无状态的
;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的
网络协议,比http协议安全。
15. 在浏览器中输入www.baidu.com 后执行的全部过程。
IP:逻辑上标记一台设备;MAC:网卡序列号,标记实际的转发数据的设备
-
首先需要 DNS 服务器解析出 www.baidu.com 的 IP 地址
1). 这是需要知道默认网关的 mac,于是,使用 RAP 协议获得默认网关的 mac
2). 组织数据发送给网关,(IP 还是 DNS 服务器的,但是 mac 地址是默认网关的mac)
3). 默认网关拥有转发数据的能力,将数据转发给路由器
4). 路由器根据自己的路由协议,选择合适的较快的路径转发数据给目的网关
5). 目的网关(即,DNS服务器所在的网关) 把数据转发给 DNS 服务器
6). DNS 服务器解析出 www.baidu.com 域名对应的 IP地址,并将其原路返回给请求的 client -
得到 www.baidu.com 对应的 IP 后,进行 TCP 三次握手建立连接
1). 第一次握手:建立连接时,客户端发送 SYN=J 包到服务器,并且客户端进入 SYN_SENT 状态,等待服务器确认(SYN,同步序列编号)
2). 第二次握手:服务器收到 SYN=J 包,会发送 SYN+ACK 包给客户端,其中,ACK 为确认包 (ACK=J+1),同时服务器会发送自己的 SYN=K 包,此时,服务器进入 SYN_RECV状态
3). 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK=K+1,此包发送完毕,客户端和服务器进入ESTABLISHED (TCP连接成功) 状态,完成三次握手 -
基于 HTTP 协议实现与 web 服务器的数据通信。
1). 浏览器发送一个Request请求去获取http://www.baidu.com
的html文件。
2). web 服务器接收到数据请求后,查询自己的服务器得到相应的响应,原路返回给浏览器,即服务器把 Response 文件对象发送回给浏览器。
3). 浏览器分析 Response 中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。浏览器会自动再次发送 Request 去获取图片,CSS文件,或者JS文件。
4). 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。 -
四次挥手,释放 TCP 连接
1). 客户端关闭到服务端的连接,所以客户端发送一个 FIN 包,并且客户端进入FIN_WAIT1 状态
2). 服务器收到FIN 包,会向客户端发送一个 ACK 包,确认序号为收到的序号加1。此时,服务端进入 CLOSE_WAIT 状态,收到 ACK 的客户端会进入 FIN_WAIT2 状态
3). 服务器关闭到客户端的连接,所以服务端发送一个 FIN 包 给客户端,并且 服务端进入 LAST_ACK 状态
4). 客户端收到该 FIN 包会进入 TIME_WAIT 状态,并向服务端发回 ACK 报文确认,收到 ACK 后服务端进入 CLOSED 状态,等待2MSL 时间后无任何响应,客户端进入 CLOSED 状态
16. 常用加密算法及原理
常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。
- 对称加密算法
对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方;接收方收到加密后的报文后,结合密钥和解密算法解密组合后得出原始数据。由于加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。
优点: 算法公开、计算量小、加密速度和效率高
缺点: 密钥单一、密钥管理困难等
常见的对称加密算法有:
DES:分组式加密算法,以64位为分组对数据加密,加解密使用同一个算法。
3DES:三重数据加密算法,对每个数据块应用三次 DES 加密算法。
AES:高级加密标准算法,是美国联邦政府采用的一种区块加密标准,用于替代原先的 DES,目前已被广泛应用。
Blowfish:Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。
- 非对称加密算法
非对称加密算法采用公钥和私钥两种不同的密码来进行加解密。公钥和私钥是成对存在,公钥是从私钥中提取产生公开给所有人的,如果使用公钥对数据进行加密,那么只有对应的私钥才能解密,反之亦然。
优点:安全性高、算法强度不复杂
缺点:加解密耗时长、速度慢,只适合对少量数据进行加密,
其常见算法包括:
RSA:RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,可用于加密,也能用于签名。
DSA:数字签名算法,仅能用于签名,不能用于加解密。
DSS:数字签名标准,技能用于签名,也可以用于加解密。
ELGamal:利用离散对数的原理对数据进行加解密或数据签名,其速度是最慢的。
- 单向加密
单向加密算法常用于提取数据指纹,验证数据的完整性。发送者将明文通过单向加密算法加密生成定长的密文串,然后传递给接收方。接收方在收到加密的报文后进行解密,将解密获取到的明文使用相同的单向加密算法进行加密,得出加密后的密文串。随后将之与发送者发送过来的密文串进行对比,若发送前和发送后的密文串相一致,则说明传输过程中数据没有损坏;若不一致,说明传输过程中数据丢失了。单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应。
常见的算法包括:MD5、sha1、sha224等,其常见用途包括:数字摘要、数字签名等等。