我正在尝试学习 ARP/TCP/HTTP 的基础知识(以一种分散的方式)。 例如,当我访问 google.com 并进行搜索时会发生什么情况?
目前我的理解:
为了让我的机器与其他人(在本例中为网关)通信, 它可能需要做一个 ARP 广播(如果它还没有 ARP缓存中的MAC地址)
然后它需要解析 google.com 的 IP 地址。它通过 联系 DNS 服务器。 (我不完全确定它是怎么知道的 DNS 服务器在哪里?或者它是知道的网关?)
这涉及到通过 TCP 协议(protocol)的通信,因为 HTTP 是 建立在它之上(TCP 握手:SYN、SYN/ACK、ACK,然后请求 内容,然后是 RST、RST/ACK、ACK)
要实际加载网页,浏览器获取 index.html,解析 它,然后根据需要发送更多请求? (图片等)
最后,要进行实际的谷歌搜索,我不明白怎么做 浏览器知道交流“我在搜索框中输入了一些东西 然后按 Enter。
这看起来对吗?/我有没有做错什么或遗漏了什么重要的东西?
最佳答案
首先尝试了解您的家庭路由器是两个设备:交换机和路由器。
关注这些事实:
For my machine to communicate with others (the gateway in this case), it may need to do an ARP Broadcast (if it doesn't already have the MAC address in the ARP cache)
正确。
当您想将文件从台式机发送到笔记本电脑时,您不想通过路由器。你想通过交换机,因为它更快(下层)。但是,您只知道网络中笔记本电脑的 IP。因此,您需要获取其 MAC 地址。这就是 ARP 发挥作用的地方。
在这种情况下,您将在 LAN 中广播 ARP 请求,直到有人响应您。这可能是路由器或连接到交换机的任何其他设备。
It then needs to resolve google.com's IP address. It does this by contacting the DNS server. (I'm not completely sure how it knows where the DNS server is? Or is it the gateway that knows?)
如果您使用 DHCP,那么已经为您提供了 DNS 服务器的 IP。如果不是,则说明您手动提供了 DNS 的 IP。所以 DNS 服务器的 IP 存储在您本地的计算机上。
发出 DNS 请求只是将其 IP 放入请求的数据包中,并将数据包转发到网络。
旁注:DHCP 还提供路由器的 IP 地址。
This involves communication through the TCP protocol since HTTP is built on it (TCP handshake: SYN, SYN/ACK, ACK, then requests for content, then RST, RST/ACK, ACK)
是的。澄清一下:当您的计算机发送请求时
FRAME[IP[TCP[GET www.google.com]]]
帧被发送到您的 LAN 交换机,交换机将其转发到路由器的 MAC。您的路由器将打开帧以检查目标 IP 并相应地路由它(在本例中为 WAN)。最后,当帧到达服务器时,服务器将打开 TCP 段并读取负载,即 HTTP 消息。 ACK/SYN 等消息仅由您的计算机和服务器处理,而不是由任何路由器或交换机处理。
To actually load a webpage, the browser gets the index.html, parses it, then sends more requests based on what it needs? (images,etc)
是的。 HTML 文件本质上是一个树结构,可以嵌入资源,如图像、java 文件、CSS 等。对于每个此类资源,必须发送一个新请求。
一旦您的浏览器获得所有这些资源,它将呈现网页。
And finally, to do the actual google search, I don't understand how the browser knows to communicate "I typed something in the search box and hit Enter".
当您键入单个字符时,它会被发送到服务器。服务器然后用它的建议来响应。就这么简单。
引用文献(好的读物):
关于http - 当我的浏览器进行搜索时会发生什么? (ARP、DNS、TCP 细节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18987103/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?