每个人都应该了解互联网的基础知识。
我们的世界越来越数字化和互联。作为这个新社会的公民,了解底层系统是有意义的。
作为软件开发人员,了解这一点至关重要。在今天的文章中,让我们更深入地了解底层协议。
在我上一篇文章中,我谈到了大规模网络以及它们是如何连接的。
但是计算机如何在如此庞大的网络上发现彼此呢?如果有适当的权限,我可以将我的计算机连接到您的计算机吗?
答案是肯定的。
当计算机连接到互联网时,它会收到一个“互联网协议 (IP) 地址。”
计算机的 IP 地址就像您家的地址。您可以从该地址发送消息,也可以在该地址接收消息。
IP 地址允许 Internet 上的计算机相互识别、连接和发送消息。

当您连接到一个网站时,您实际上只是连接到另一台计算机——该网站的“服务器”。
该服务器也有一个 IP 地址。因此,连接只是在这两个唯一地址之间路由信息包的问题。
您的计算机现在有一个 IP 地址。好奇它是什么?
20.205.243.166很难记住。记住github.com要容易得多。
当我打字时,我的电脑如何知道要去哪里github.com?
域名系统是另一项互联网创新。它允许您的计算机查找github.com的关联 IP 地址

DNS 背后的复杂性要高得多。它允许网站围绕用户如何连接到域来设置各种规则和重定向。
但归根结底,DNS 是一项解决难题的简单技术:解决整个 Web 上的记录,具有高可扩展性、复制性和记录之间的最终一致性。
到目前为止,我的电脑有:
20.205.243.166
接下来,我们需要建立连接并开始交换信息!
这是怎么发生的?
早期的互联网先驱们想出了一些关于计算机应该如何在互联网上相互连接和交谈的重要规则。所有在线计算机都遵循这些规则,因此存在共同语言。
这些通信规则称为传输控制协议/Internet 协议 (TCP/IP)。
TCP/IP 的细节可以写满整篇文章。为简洁起见,我们只说 TCP/IP 涉及将数据分成小的信息“数据包”。当您想通过 Internet 发送文件时,您的计算机会遵循特定规则将该文件分成多个较小的数据包。

这些单独的数据包可以通过不同的路由到达目标 IP 地址。它们可能以不同的顺序到达、重复或根本没有到达。
当它们被接收时,接收方将确认发送回发送方。基本上,他们收到的是数据的数据包。如果一个数据包没有到达,发送方将重新发送丢失的数据包。
最终,TCP 保证所有数据包都将到达。当他们这样做时,协议指定了接收方可以重组数据包,以从发送方分割文件的方式。
具体来说,当您浏览网页时,您可能正在使用超文本传输协议 (HTTP)。这是专为网页和丰富格式设计的 TCP/IP 子集。
超文本文件可以链接在一起并包含嵌入其中的媒体。当您在 Web 上查看超文本标记语言 (HTML) 页面时,您的浏览器正在使用 HTTP 与网站服务器进行通信。
浏览器是允许您的计算机呈现这些 HTML 页面和浏览网络的软件。
这一切都把我们带到了一个重要的点。
尽管我们在对话中可以互换使用它们,但网络和互联网并不是一回事。
互联网是指世界上所有连接设备的网络协议。IP 地址和数据包路由是计算机之间所有连接通信的基础。互联网协议的前身自 1970 年代就已存在。
万维网是 Tim Berners-Lee 在 1980 年代和 90 年代发明的。它是以 HTML 呈现并通过 HTTP 规则进行通信的网站。网络建立在互联网之上,它只是互联网功能的一个子集。
那么,我的电脑如何连接到github.com?
将数据包发送到 GitHub。

具体来说,请求是获取主页。

DNS 查找 IP 地址,TCP/IP 帮助将请求路由到正确的目的地。

GitHub 确认该请求,并且其服务器生成回复给我。

响应使用超文本传输协议,并包括超文本标记语言。

数据包以各种方式路由回我的计算机,同样使用 TCP。

所有这一切还有更多的方法。这篇文章是一个简化的、快乐的路径示例,说明如何通过 Internet 进行连接。
如果你喜欢我的文章,点赞,关注,转发!
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为