【CS】笔试常见题目
- 网络
- 算法
- git
一、网络
1. IP地址分类:
- IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址。
- 最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。
- A类:由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
A类地址的第一组数字为1~126。注意,数字0和 127不作为A类地址,数字127保留给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送。 - B类:一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。
- C类:一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
- D类多用于多点广播:D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
- E类:以“llll0”开始,为将来使用保留。
- 全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
- 在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
- A类地址:10.0.0.0~10.255.255.255
- B类地址:172.16.0.0~172.31.255.255
- C类地址:192.168.0.0~192.168.255.255
- A类:由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
2. 常见网络协议
- 应用层常用协议:文件传输,电子邮件,文件服务,虚拟终端
- DNS:域名系统
- FTP:文件传输协议
- telnet远程终端协议
- HTTP:超文本传送协议(使用面向连接的TCP作为运输层协议,保证了数据的可靠传输)
- 电子邮件协议SMTP
- POP3:邮件读取协议
- SNMP:简单网络管理协议
- WebSocket:是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。
- 传输层: 提供端对端的接口
- TCP:
- 提供IP下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。
- 支持的应用协议主要有:Telnet、FTP、SMTP等
- UDP:
- 不为IP提供可靠性、流控或差错恢复功能,是非面向连接,不可靠的传输。
- 支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等.
- TCP:
- 网络层:为数据包选择路由
- IP
- ICMP
- RIP
- OSPF
- BGP
- IGMP
- 数据链路层:传输有地址的帧以及错误检测功能
- SLIP
- CSLIP
- PPP
- ARP
- RARP
- MTU
- 物理层:以二进制数据形式在物理媒体上传输数据
- ISO2110
- IEEE802
- IEEE802.2
参考:应用层常用协议
3. HTTP状态码:
- 1XX表示消息:表示请求已被接受,需要继续处理。
这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。 这些状态码代表的响应都是信息性的,标示客户应该采取的其他行动。100(继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 - 2XX表示:成功
200(成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果针对您的 robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。 201(已创建) 请求成功并且服务器创建了新的资源。 202(已接受) 服务器已接受请求,但尚未处理。 203(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。 204(无内容) 服务器成功处理了请求,但没有返回任何内容。 205(重置内容) 服务器成功处理了请求,但没有返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。 206(部分内容) 服务器成功处理了部分 GET 请求。 - 3XX表示:重定向
300(多种选择) 针对请求,服务器可执行多种操作。服务器可根据请求者 (user-agent) 选择一项操作,或提供操作列表供请求者选择。 301(永久移动) 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。 302(临时移动) 服务器目前从不同位置的网页响应请求,但申请人应当继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置,但不应使用此代码来告诉 Googlebot 页面或网站已经移动,因为 Googlebot 要继续抓取原来的位置并编制索引。 303(查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。 304(未修改) 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
如果网页自请求者上次请求后再也没有更改过,您应当将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。由于服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,因此可节省带宽和开销。
305(使用代理) 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应当使用代理。 307(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应当继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 <a href=answer.py?answer=>301</a> 代码类似,会自动将请求者转到不同的位置,但您不应使用此代码来告诉 Googlebot 某个网页或网站已经移动,因为 Googlebot 会继续抓取原有位置并编制索引。 - 4XX表示:客户端错误
400(错误请求) 服务器不理解请求的语法。 401(身份验证错误) 此页要求授权。您可能不希望将此网页纳入索引。如果您的 Sitemap 中列出该网页,您可以将其删除。但如果您将其保留在您的 Sitemap 中,我们就不会抓取或索引该网页(尽管该网页将继续保持错误状态在此处列出)。如果我们将其作为搜索抓取的一部分抓取,您可以在我们的网站管理员信息中查阅其原因。 403(禁止) 服务器拒绝请求。如果您在 Googlebot 尝试抓取您网站上的有效网页时看到此状态码(可以在 Google 网站管理员工具<strong>诊断</strong>下的<strong>网络抓取< /strong>页面上看到此信息),可能是您的服务器或主机拒绝 Googlebot 访问。 404(未找到) 服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。
如果您的网站上没有 robots.txt 文件,而您在 Google 网站管理员工具"诊断"标签的 robots.txt 页上看到此状态码,那么这是正确的状态码。但是,如果您有 robots.txt 文件而又看到此状态码,则说明您的 robots.txt 文件可能命名错误或位于错误的位置(该文件应当位于顶级域,名为 robots.txt)。
如果对于 Googlebot 尝试抓取的网址看到此状态码(在"诊断"标签的 HTTP 错误页面上),则表示 Googlebot 追踪的可能是另一个页面的无效链接(是旧链接或输入有误的链接)。
405(方法禁用) 禁用请求中指定的方法。
406(不接受) 无法使用请求的内容特性响应请求的网页。 407(需要代理授权) 此状态码与 401 类似,但指定请求者必须授权使用代理。如果服务器返回此响应,还表示请求者应当使用代理。 408(请求超时) 服务器等候请求时发生超时。 409(冲突) 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,以及两个请求的差异列表。 410(已删除) 请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时会用来替代 404 代码。如果资源已永久删除,您应当使用 301 指定资源的新位置。 411(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 413(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 414(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 415(不支持的媒体类型) 请求的格式不受请求页面的支持。 416(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态码。 417(未满足期望值) 服务器未满足"期望"请求标头字段的要求。 - 5XX表示:服务器错误
500(服务器内部错误) 服务器遇到错误,无法完成请求。 501(尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时则会返回此代码。 502(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 503(服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。 504(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 505(HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
参考:HTTP 状态码
二、算法
1. 排序问题总结
参考:
三、git
1. git和svn的区别?
- git是分布式的,svn不是,是集中式的。GIT跟SVN一样有自己的 集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看历史版本记录,创建项 目分支等。也就是说,git和其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提及,合并,也可以不用联网在本地提及。
- GIT把内容按元数据方式存储,而SVN是按文件。.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
- git分支和svn分支的不同:
- 分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。在SVN,分支是一个完整的目录。且这个目录拥有完整的实际文件。如果工作成员想要开啟新的分支,那将会影响“全世界”!每个人都会拥有和你一样的分支。而 Git,每个工作成员可以任意在自己的本地版本库开啟无限个分支。
- 然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
- GIT没有一个全局的版本号,而SVN有:
- GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏
- Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网
-
版本库:
-
SVN只能有一个指定中央版本库。当这个中央版本库有问题时,所有工作成员都一起瘫痪直到版本库维修完毕或者新的版本库设立完成。
-
而 Git可以有无限个版本库。或者,更正确的说法,每一个Git都是一个版本库,区别是它们是否拥有活跃目录(Git Working Tree)。如果主要版本库(例如:置於GitHub的版本库)发生了什麼事,工作成员仍然可以在自己的本地版本库(local repository)提交,等待主要版本库恢复即可。工作成员也可以提交到其他的版本库!
-
2. git常用命令
git init #把当前目录变成git可以管理的仓库 git add "read.me" #git add + 要提交的文件名. 把文件添加到仓库 git commit -m "要提交的说明" git status # 查看仓库当前状态 git diff #查看修改内容 git log #查看提及日志 git reset --hard HEAD^ #回退到HEAD开头的版本库 git reflog #查看命令历史,以便确定要回退到哪个版本库
git checkout -- <filename> #把文件在工作区的修改全部撤销。即回退到最近一次git commit或git add时状态
git reset HEAD <filename> #把暂存区的修改回退到工作区。用HEAD表示最新的版本
#如果已经提交了不合适的修改到版本库,想要撤销本次提交,只要还没有推送到远程库,可用版本回退
git rm <filename> #删除文件
git checkout -- <filename> #恢复
git remote add origin git@github.com:xzhyj93/reposName.git #本地仓库关联远程库
git push -u origin master #把本地库master分支下的内容推送到远程库。第一次使用参数-u表示把本地的master分支和远程的master分支关联起来
git push origin master
git clone git@github.com:xzhyj93/respoName.git #从远程库克隆。
#git支持多种协议,git://使用ssh,也可以使用https
git checkout -b dev #创建并切换到分支dev,相当于下面两条命令
git branch dev #创建分支dev
git checkout dev #切换到分支dev
git branch #查看当前分支。会列出所有分支,当前分支前面会标一个*号
git merge dev #把dev分支的工作成果合并到master分支上
git branch -d dev # 删除dev分支
git stach #保存当前工作现场
git stash list #查看stash
git stash apply #回复工作现场(并不删除)
git stash drop #删除工作现场
git stash pop #恢复并删除stash
git stash apply stash@{0} #恢复指定stash
git remote #查看远程库信息
git remote -v # 查看更详细的远程库信息
#远程多人协作
git push origin brach-name #从本地推送失败
git pull #如果推送失败,使用这个命令抓取远程的新提交。如果有冲突,要先处理冲突
git checkout -b dev origin/dev #创建远程origin的dev分支到本地
git branch --set-upstream branch-name origin/branch-name # 建立本地分支和远程分支的关联
git tag v1.0 #打标签
git tag #查看所有标签
git show <tagname> #看到说明文字,查看标签信息
git tag -d <tagname> #删除标签
3. 关于git的暂存区和工作区
- 工作区(Working Directory):
- 就是在电脑里能看到的目录
- 版本库(Repository):
- 工作区的隐藏目录.git就是版本库
- 包含:1)暂存区(stage/index);2)分支master,以及指向master的指针HEAD;3)其他
提交的过程:
- git add:把文件修改添加到暂存区
- git commit提交更改,实际上是把暂存区的所有内容提交到当前分支
- 提交后,如果没有对工作区做任何更改,那么工作区就是干净的。
参考:git和SVN的区别