- 网络七层模型和tcp/ip模型
OSI模型:
常见的应用层协议:
TCP/IP五层模型: - TCP三次握手,四次挥手的过程
建立连接过程:
首先Client端发送连接请求报文(SYN同步信号和客户端自己的序列号),Serve端接收连接请求后回复ACK报文和服务端自己的序列号,并为这次连接分配资源。客户端收到ACK和服务端的序列号后,回复ACK对服务端进行确认,并分配资源,从而建立起连接。
断开连接过程:
中断连接的可以是客户端,也可以是服务端。
【注意】在TIME_WAIT状态(2MSL,即2倍的MSL,maximum segment lifetime 报文最大生存时间,他是任何报文在网络上存货的最长时间,超过这个时间的报文将被丢弃,MSL>=TTL,Time to Live,生存时间,单个报文的生存时间)
【问题】为什么TIME_WAIT状态需要经过2MSL才能到close状态?
答:假想网络是不可靠的,最后一个ACK有可能丢失,对方没有收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后再发一个ACK应答包。 - TCP为什么是三次握手、四次挥手
【为什么是四次挥手】在关闭连接时,当server端收到FIN报文时,很可能并不会立即关闭SOCKET,可能还有数据没处理完,所以只能先回复一个ACK报文,告诉客户端“你发的FIN报文我收到了”,只有等到Server端所有的报文都发送完了,才能发送FIN报文,所以不能一起发送,需要四次握手。 - tcp粘包
在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接。在TCP的socket编程中,发送端和接收端都有成对的socket。发送端为了将多个发往接收端的包,更加高效的的发给接收端,于是采用了优化算法(Nagle算法),将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。那么这样一来,接收端就必须使用高效科学的拆包机制来分辨这些数据。
1.Q:什么是TCP粘包问题?
TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。2.Q:造成TCP粘包的原因
(1)发送方原因TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
只有上一个分组得到确认,才会发送下一个分组
收集多个小分组,在一个确认到来时一起发送
Nagle算法造成了发送方可能会出现粘包问题(2)接收方原因
TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
3.Q:什么时候需要处理粘包现象?
如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象
如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了
4.Q:如何处理粘包现象?
(1)发送方对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。
(2)接收方
接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。
(2)应用层
应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。
解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?
格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。
5.Q:UDP会不会产生粘包问题呢?
TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。
举个例子:有三个数据包,大小分别为2k、4k、6k,如果采用UDP发送的话,不管接受方的接收缓存有多大,我们必须要进行至少三次以上的发送才能把数据包发送完,但是使用TCP协议发送的话,我们只需要接受方的接收缓存有12k的大小,就可以一次把这3个数据包全部发送完毕。
- 基于udp设计一个可靠的协议?
那么既然TCP可以面向连接实现通信,为什么不直接使用TCP而放弃UDP呢?UDP自然有它的优点。UDP可以不用实时地建立连接,在没有数据的时候不会占用资源,而TCP需要保持一种稳定地连接状态,UDP明显比TCP更加灵活高效一些,但是它会丢包,为了解决丢包等问题,就需要人为编写协议来约束这个过程了。
【协议设计】TCP VS UDP
tcp 是面向连接提供可靠传输;UDP是面向无连接,提供不可靠连接
Tcp 提供流量控制 ; UDP不提供流量控制
Tcp 保证传输数据顺序 ; UDP不保证传输顺序,也就是可能是乱序收包
TCP 面向字节流 ; UDP 面向数据包
设计一个基于udp的可靠连接算法
针对数据完整性 –> 加上一个16或者32位的CRC验证字段
针对乱序 –> 加上一个数据包序列号SEQ
针对丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制
针对协议字段 –> protol 字段,标识当前使用协议 -
http报文结构
【URL】http使用统一资源定位符:协议://主机:端口/路径
【http请求报文】请求行、首部、空行、主体
(1)请求行:方法,URL 空行 协议的版本(中间空格隔开) 请求方法有如下几种: GET:从服务器获取一份文档 HEAD:只从服务器获取文档的首部 POST:向服务器发送需要处理的数据,常用于表单提交。 PUT:将请求的主体部分存储在服务器上,从服务器上向客户发送文档 TRACE:对可能经过代理服务器传送到服务器上去的报文进行追踪 OPTIONS:决定可以在服务器上执行哪些方法 DELETE:从服务器上删除一份文档 GET:当客户端要从服务器中读取某个资源时,使用GET 方法。GET 方法要求服务器将URL 定位 的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用GET 方法时, 请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表URL 的结尾与请求参数的开始, 传递参数长度受限制。例如,/index.jsp?id=100&op=bind。 POST:当客户端给服务器提供信息较多时可以使用POST 方法,POST 方法向服务器提交数据, 比如完成表单数据的提交,将数据提交给服务器处理。GET 一般用于获取/查询资源信息, POST 会附带用户数据,一般用于更新资源信息。POST 方法将请求参数封装在HTTP 请求数据中, 以名称/值的形式出现,可以传输大量数据; (2)首部 首部名:(空格)首部值(回车换行) ● User-Agent:产生请求的浏览器类型;标志客户程序 ● Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组, 用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型; ● Accept-Language:客户端可接受的自然语言; ● Accept-Encoding:客户端可接受的编码压缩格式; ● Accept-Charset:可接受的应答的字符集; ● Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机; ● connection:连接方式(close 或 keepalive); ● Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie; (3)空行:通知服务器以下不再有请求的头部信息 (4)主体(请求数据):相关备注信息
【响应报文】状态行、首部、空格、主体
(1)状态行:协议版本 (空格) 状态码 (空格) 短语 ● 状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示: 1xx:表示服务器已接收了客户端请求,客户端可继续发送请求; 2xx:表示服务器已成功接收到请求并进行处理; 3xx:表示服务器要求客户端重定向; 4xx:表示客户端的请求有非法内容; 5xx:表示服务器未能正常处理客户端的请求而出现意外错误,服务器差错; ● 状态码描述文本有如下取值: 200 OK:表示客户端请求成功; 400 Bad Request:表示客户端请求有语法错误,不能被服务器所理解; 401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域 一起使用; 403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不 提供服务的原因; 404 Not Found:请求的资源不存在,例如,输入了错误的URL; 500 Internal Server Error:表示服务器发生不可预期的错误,导致无法完成客户端的请求; 503 Service Unavailable:表示服务器当前不能够处理客户端的请求,在一段时间之后, 服务器可能会恢复正常; (2)响应首部:首部名 :(空格)首部值 Location:Location响应报头域用于重定向接受者到一个新的位置。例如:客户端所 请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回 Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源; Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件 (浏览器)和操作系统的信息。 Content-Length 给出文档长度 Content-type 给出媒体类型 Vary:指示不可缓存的请求头列表; Connection:连接方式;对于请求来说:close(告诉WEB 服务器或者代理服务器,在完成 本次请求的响应后,断开连接,不等待本次连接的后续请求了)。keepalive(告诉WEB服务器或者 代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求);对于响应来说: close(连接已经关闭); keepalive(连接保持着,在等待本次连接的后续请求); Keep-Alive:如果浏览器请求保持连接,则该头部表明希望WEB 服务器保持连接多长时间(秒); 例如:Keep-Alive:300; WWW-Authenticate:WWW-Authenticate响应报头域必须被包含在401 (未授权的)响应 消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送 一个包含了Authorization 报头域的请求; (3)空行:最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有 响应头部。 (4)响应主体:服务器返回给客户端的文本信息;
-
浏览器输入Google地址回车,是怎么上网的(dns啥的)
- cookie机制、session机制
Cookie 和 Session机制详解_朱小厮的博客-CSDN博客 - http和https的区别、默认端口(80、443)
https://www.cnblogs.com/wqhwe/p/5407468.html - https最耗时的环节
https://www.cnblogs.com/mylanguage/p/5635524.html - http1.0、1.1、2.0的区别
HTTP1.0和HTTP1.1和HTTP2.0的区别_艾伦lee的博客-CSDN博客 - 常用状态码
HTTP 状态码 | 菜鸟教程 - tcp和udp的区别
面试题:UDP&TCP的区别_tcp和udp的区别 面试题_sifanchao的博客-CSDN博客 - dns协议
DNS(域名解析协议)详解_dns协议_honeyCR的博客-CSDN博客 - 延迟ack
https://www.cnblogs.com/Yfling/p/6738896.html
Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法) - 简书 - tcp拥塞控制和流量控制
TCP之 流量控制(滑动窗口)和 拥塞控制(拥塞控制的工作过程)_dangzhangjing97的博客-CSDN博客 - post和get的区别、如果post换成get会怎样
https://www.cnblogs.com/liziweiblog/p/11066333.html - 进程、线程、协程,以及python中代码实现、多线程交替打印数组
线程,进程,协程详细解释_进程线程协程_蹦蹦跳跳小米粒的博客-CSDN博客
https://xujiajia.blog.csdn.net/article/details/109411040
python多线程交替打印abc_编程python使用多线程交替打印abc_小黄鸭zm的博客-CSDN博客 - 进程、线程、协程的通信机制,线程同步机制
https://www.cnblogs.com/fanguangdexiaoyuer/p/10834737.html
进程、线程、协程 进程间的通信方式 IO多路复用的方式_基于io多路复用,两个线程之间怎么通信_t0tott的博客-CSDN博客 - 进程、线程、协程是如何切换的
linux进程-线程-协程上下文环境的切换与实现_linux 线程切换hook_runner668的博客-CSDN博客 - 线程池、进程池、协程池介绍
https://www.cnblogs.com/wangnanfei/p/11359072.html
进程池\线程池,协程,gevent - 简书 - 并发与并行、如果两个线程同时访问一块内存,应该怎么办
- 僵尸进程、孤儿进程,是怎么造成的
僵尸进程,孤儿进程,守护进程解释_BS有前途的博客-CSDN博客
https://www.cnblogs.com/lfri/p/12575637.html
僵尸进程zombie与孤儿进程orphan_CHENG Jian的博客-CSDN博客 - 多线程中线程崩溃会产生什么影响?
线程崩溃必会使进程崩溃吗_weixin_34283445的博客-CSDN博客 - 进程调度算法
操作系统面试总结—进程线程_进程非抢占sjf_CoCo-_的博客-CSDN博客 - 页面置换算法
https://www.cnblogs.com/fkissx/p/4712959.html - 缺页中断
操作系统:虚拟页式存储管理(缺页中断、页面置换算法)_虚拟页内存管理的实现是否存在bug_Sharp_UP的博客-CSDN博客 - LRU的实现
- 缓存策略
操作系统——缓冲区(buffer)与缓存(cache)_操作系统常见的缓冲区_waS_TransvolnoS的博客-CSDN博客
https://www.cnblogs.com/xingxia/p/cache.html - 虚拟地址和物理地址的区别
https://www.cnblogs.com/lemaden/articles/10460757.html - 快表
https://www.cnblogs.com/mengd/p/12561091.html - 死锁、原因和解除
https://www.cnblogs.com/JimmyFanHome/p/9914562.html - 互斥锁等
多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)_同步锁和互斥锁的区别_~青萍之末~的博客-CSDN博客 - 用户态、内核态的区别
https://www.cnblogs.com/cyyz-le/p/10962818.html - 地址空间是什么?
程序的地址空间_audience_fzn的博客-CSDN博客 - 软连接、硬链接
软连接和硬链接的区别_硬链接和软链接的区别_低头看天,抬头走路的博客-CSDN博客 - 文件和目录的区别
https://www.cnblogs.com/consttree/p/13887143.html - hash冲突解决办法
解决Hash冲突四种方法_哈希冲突的解决方法_姚明锋的博客-CSDN博客 - hash扩容,hash一致性、rehash
https://www.cnblogs.com/panxuejun/p/8695106.html
Hashmap实现原理及扩容机制详解_hashmap扩容机制_lkforce的博客-CSDN博客
一致性Hash原理与实现 - 简书
新浪博客
Rehash_uuup111的博客-CSDN博客 - hashmap put的实现、hashmap在jdk1.8版本前后的改动
HashMap之put原理分析。_hashmap的put原理_一念之间•的博客-CSDN博客 - hashmap和concurrentHashmap的区别
HashMap和ConcurrentHashMap区别看完没人能难住你_concurrenthashmap和hashmap区别_domoreda的博客-CSDN博客 - 介绍下hashtable
HashTable详解_hashtable是什么_走出去拍拍照的博客-CSDN博客 - c++的多态,各类容器vector、list的区别
- 虚函数实现机制
- 智能指针
- 多态、重载、重写
- c++中栈和堆的区别
https://blog.csdn.net/qq_18150255/article/details/89786510 - c++动态链接和静态链接的区别
C++ 动态链接库和静态链接库_zy_ky的博客-CSDN博客 - c++构造函数可以是虚函数吗?析构函数呢?
- map底层实现,有没有O(1)访问数据的数据结构?
- 深拷贝、浅拷贝
彻底讲明白浅拷贝与深拷贝 - 简书 - 引用和指针
C++中指针和引用的区别_给我一个和尚的博客-CSDN博客 - 红黑树、完全二叉树、平衡二叉树等
- b树、b+树详细
B树和B+树_b树与b+树_小猫的秋刀鱼的博客-CSDN博客 - mysql的索引
Mysql索引整理总结_阿飞云的博客-CSDN博客
MySQL 高级知识(索引、优化)_索引可以优化多少_Crystal_Mria的博客-CSDN博客 - 什么情况下不适合加索引(频繁改动和删除的数据、数据量小、区分度小的字段(比如性别))
- 索引失效的情况(不满足最左匹配原则、where后面不能用函数)
- 索引优化
MySQL索引原理及慢查询优化 - 美团技术团队
MySQL 索引优化全攻略 | 菜鸟教程
MySQL索引优化 - 简书 - mysql引擎对比
MySQL两种引擎的区别_mysql引擎区别_isxuran的博客-CSDN博客
Mysql 存储引擎的区别和比较_mysql存储引擎_zgrgfr的博客-CSDN博客 - innodb隔离机制、原子特性
深入理解Mysql的四种隔离级别_Mysql_脚本之家
mysql四种隔离级别和mvcc以及锁之间的关系_marco__的博客-CSDN博客
MySQL中的锁机制和MVCC_mysq 的锁和mvcc有什么关系_Coder648的博客-CSDN博客
Mysql事务(附MVCC机制举例详解)_mvcc 举例_nZk丶的博客-CSDN博客 - innodb底层数据结构
图解:深入理解MySQL索引底层数据结构与算法-腾讯云开发者社区-腾讯云
17. mySql的底层InnoDB数据结构 - 简书 - 关系型和非关系型的区别、mysql和mongodb的区别
简述关系型数据库和非关系型数据库 - 简书
https://my.oschina.net/u/4312205/blog/4671675 - 数据库范式
数据库之六大范式详解_数据库范式_小九的博客的博客-CSDN博客 - 数据库崩溃,如何保证数据的一致性
MySQL 数据库崩溃(crash)的常见原因和解决办法_互联网全栈架构的博客-CSDN博客
高并发下如何保证缓存和数据库的数据一致性?_u011277123的博客-CSDN博客 - linux下常用的指令
Linux常用命令(面试题)_linux系统doc模式下重启命令_布玮的博客-CSDN博客 - linux下杀死进程:kill -9,kill -9 kill的区别,底层是如何实现的
- 在linux中ctrl+c可以kill一个进程,怎么做到的?属于哪种通信?
- linux底层是如何创建线程的
Linux下的线程创建_linux创建线程_zedjay_的博客-CSDN博客 - 如果当前界面崩了,如何排查问题
前端面试题:页面出现空白,怎么排查定位问题? - SegmentFault 思否
https://bbs.csdn.net/topics/300247811
百度安全验证 - 常用算法:快排、归并排序等的实现和复杂度分析
- 消息队列、为什么用rabbitmq,与kafaka的区别
为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?_Joker_nupt的博客-CSDN博客
https://blog.csdn.net/jiagouwgm/article/details/97619753
消息队列Rabbitmq与Kafka对比分析 | 小笙's Blog - 数据库的权限管理机制
https://cn-blogs.cn/archives/2963.html
多用户同时处理同一条数据解决办法_baimin7657的博客-CSDN博客 - 如何处理多用户同时访问后台?
大型网站是怎样解决多用户高并发访问的_解决多用户系统访问的技术_随心而活的博客-CSDN博客 - 分布式爬虫中数据的流向
- 爬虫选用的算法、过程
- 项目中遇到什么问题?怎么解决的
- select/epoll区别,好处,内核调用
细说select、poll和epoll之间的区别与优缺点_weixin_34029680的博客-CSDN博客
深入理解select、poll和epoll及区别_poll epoll_panamera12的博客-CSDN博客 - python装饰器
python装饰器简介---这一篇也许就够了(推荐)_python_脚本之家
Python 函数装饰器 | 菜鸟教程 - python参数*和**的区别
- 数据证书存储在哪里?
数字证书存储位置名称_excel数字签名中证书的存储位置_假装是AA的博客-CSDN博客 - 设计数据库索引时,依据什么原则?
MySQL数据库索引的设计原则_azhen5222的博客-CSDN博客
数据库索引的设计原则_大树叶的博客-CSDN博客 - 访问网站延迟,可能发生什么?
- jdbc连接的对象是什么?
- Unicode和utf-8的区别
Unicode与UTF-8的区别_unicode和utf-8的区别_Hern(宋兆恒)的博客-CSDN博客 - 值传递和引用传递的区别
值传递和引用传递的区别_ 暝七夜的博客-CSDN博客 - shell编程
- sql语句
计算机面试题整理-后台开发、软件开发面试宝典八股文
于 2021-03-19 00:04:04 首次发布