草庐IT

从客户端到服务器的 HTTP 请求。 TCP/IP 堆栈之旅

coder 2023-09-19 原文

我试图从 HTTP 请求通过的数据包和硬件的角度理解从主机到服务器的过程。

首先,HTTP 数据被放入 TCP 数据包(第 4 层)。然后将其打包到 IP 数据包(第 3 层)中,由 NIC(第 2 层)成帧并通过物理介质(电缆、光纤等)传输(第 1 层)到最近的路由器。

问题 1. 路由器中的 NIC(连接到客户端 LAN 的那个,因为路由器有两个 NIC)是否重建帧并将有效负载(即 IP 包)传递给路由器的处理器?这似乎合乎逻辑,但我无法在网上找到任何明确说明这一点的地方。

路由器然后有一个 IP 包并根据其路由表通过另一个 NIC 转发它,它再次将它打包并传输它。

逐跳,服务器的 NIC 最终接收并重建帧并将它们传递给 ...(参见问题 2)...,它解压缩 TCP 包并以某种方式读取 HTTP 信息并使用给定的参数执行操作。

问题 2: 内核?是不是负责电脑内部IP打包/解包的?

问题3:计算机中是如何负责TCP和“理解”HTTP的?它是操作系统的哪一部分?我猜这也是理解 HTTP 的原因。

我知道还有更多细节,但整个问题太长了。我也很高兴看到有趣的链接来深入研究这个问题。

最佳答案

Question 1. Does the NIC (the one connected to the client's LAN, since the router has two NICs) in the router reconstructs the frames and passes the payload (so the IP package) to the router's processor? It seems logical, but I have not been able to find anywhere online where this is explicitly said.

我不知道你在这里所说的“重建”是什么意思。 NIC 接收帧并将其传递给 CPU,可能是通过 DMA。

The router then has an IP package and forwards it according to its routing table through the other NIC, which frames it again and transmits it.

这个词是'packet',不是'package'。否则正确。

Hop-by-hop, the NIC of the server finally receives & reconstructs the frames

同样,我不知道“重建”是什么意思。接收到帧。

and passes them to the ...(See Question 2)..., which unpacks the TCP package and somehow the HTTP information is read and the operation is executed with the arguments given.

Question 2: Kernel? Is it the one responsible for IP packaging/unpackaging inside the computer?

到网络堆栈的 IP 层,将其向上传递到 TCP 层,最终将数据传递到服务器应用程序。

Question 3: How is responsible for TCP and "understanding" HTTP in the computer?

TCP层负责理解TCP。 HTTP 是一个应用层协议(protocol),被应用理解。

What part of the OS is it? I am guessing this one is also the responsible for understanding HTTP.

没有“它”。这里有两个单独的问题和两个单独的答案:见上文。

关于从客户端到服务器的 HTTP 请求。 TCP/IP 堆栈之旅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35303348/

有关从客户端到服务器的 HTTP 请求。 TCP/IP 堆栈之旅的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用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

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  10. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

随机推荐