进行软件测试面试时,相信大家或多或少都会被问到一些关于计算机网络的问题,今天这篇文章就目前反馈比较多的计算机网络面试题及答案做了一个整理,在找工作的你,赶紧看过来~
答案:
应用层: 网络服务与最终用户的一个接口。协议有:HTTP FTP TFTP DNS协议等;
表示层: 数据的表示、安全、压缩的格式;
会话层: 建立、管理、终止会话。对应主机进程,指本地主机与远程主机正在进行的会话
传输层: 定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP协议。
网络层: 进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP IP(IPV4 IPV6)
数据链路层: 建立逻辑连接、进行硬件地址寻址功能。将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层: 建立、维护、断开物理连接。
答案:
TCP协议要建立连接的时候,需要经历三次握手的过程:
第一次握手: 是客户端向服务器发起的,用来申请建立连接的,这个报文中的SYN标志位标记为1,所以我们也叫作SYN包;
第二次握手:是服务器回复客户端的,用来确认并接受连接请求的,这个报文中的SYN位和ACK位都标记为1,所以叫做SYN-ACK报文;
第三次握手:仍然是客户端发给服务器的,用来确认服务器的回复消息,这个报文中的ACK标志位标记为1,所以我们也叫作ACK包。
这就是TCP协议的三次握手过程。
答案:
3次。
客户端发送请求建立连接的数据包可能会滞留在网络中,等到后续这个连接断开之后再次到达服务器,那么服务器会发送消息告诉客户端可以发送消息,但是客户端不会理会服务器也不会发送消息,服务器端处于等待状态,会造成资源浪费
答案:
TCP协议完成了数据发送之后,就会断开连接,此时就需要经历四次挥手的过程:
第一次挥手:是客户端向服务器发起的,用来申请断开连接的,这个报文中的FIN标志位标记为1,所以我们也叫作FIN包;
第二次挥手:是服务器回复客户端的,用来确认客户端的上一个断开连接请求的,所以是一个ACK报文;
第三次挥手:仍然是服务器发给客户端的,用来告知客户端服务器的数据发送完毕了,需要断开连接;这个报文中的FIN标志位标记为1,所以也是一个FIN包。
第四次挥手:是客户端回复服务器的,确认服务器的上一个断开连接请求,所以也是一个ACK报文;
这就是TCP协议的四次挥手过程。
答案:
三次握手是TCP协议建立连接的过程,建立连接,我只需要确认一下你在我也在就好了啊,三次握手够了;
但是四次挥手是TCP协议是为了断开连接的,所以需要确保我既结束发送数据,也结束接收数据;开始客户端先结束发送并告知服务器,服务器确认后就结束接收了;这两次挥手完成后,客户端还在接收数据哦,服务器也还在发送;所以需要服务器也发送一次FIN包,告知我也结束数据发送了,客户端确认后,才双方都关闭发送和接收数据通道,所以必须要四次~
答案:
TCP协议和UDP协议都是传输层的两个协议: 它们的区别主要有如下3个方面:
第一:TCP是面向连接,就像打电话要先拨号建立连接一样,而UDP是无连接的,即发送数据之前不需要建立连接。
第二:TCP可以提供可靠的服务,能保证数据传输无差错,不丢失,不重复,且按序到达;而UDP协议只是尽最大努力交付,即不保证可靠交付。
第三:因为TCP以上两个特点,所以对应传输效率相对较低,而UDP效率高,所以一些注重速度而不在乎的丢包的场景,会选择用UDP协议,比如IP电话,流媒体等。
答案:
状态码有如下几种:
1xx(临时响应):表示临时响应并需要请求者继续执行操作的状态代码。
2xx (成功):表示成功处理了请求的状态代码。
3xx (重定向):表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
4xx(请求错误):这些状态代码表示请求可能出错,妨碍了服务器的处理。
5xx(服务器错误):这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
答案:
答案:
https协议通过SSL协议外壳来实现它的安全性,主要体现在三个方面:
第一: 数据是加密的,SSL协议通过非对称秘钥分发的方式完成秘钥的协商,然后通过对称秘钥的加密方式完成数据的加密;
第二:会验证对方身份。服务端和客户端双方会需要向CA机构申请证书,再SSL握手阶段会验证双方证书是否可信,从而验证双方的身份,防止第三方冒充;
第三:保证数据的完整性。每次的数据都会加上MAC摘要并签名,接收的数据和发送的数据这个摘要信息一致的,就表示数据没有被篡改过。
答案:
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您