TCP IP 里的网络请求 到底是什么样的?

当我输入 一个url 在浏览器的地址栏按下回车 这个以前也写过博客了:一次URL输入域名按下回车到底发生了什么?

今天聊聊 传输层 在中间做了什么事:

如果我输出 慕课网 的网址:www.imooc.com

首先我会去请求 慕课网的 ip 地址: 我请求的的数据包入下图:

如图所示: 第一行是我电脑发出去 数据链路层的数据包。

第二行 是 笔记本的 mac 地址 ,请求会请求我们的路由器的,然后由路由器 转发 出去, 看到那个TP-link 也应该猜到啦。

第三行是 网络层 也是 tcp ip 所在的一个层,Src: 192.168.0.108 是 我们的ip地址 DST:116.228.111.118 是 DNS服务器的 地址。

第四行可以看到,我们DNS的请求是作为 UDP 形式发出去的,为什么是UDP呢? 因为我们只是想得到慕课网的地址,还没有开始建立连接,所以用UDP就可以了。

第五行就是UDP 包的内容了,它请求的是什么呢?看图 一张图放不下,看两张 图中 的标记

请求的数据是在一个数据包里的,可以看到 箭头所指,当前是64号包、

最后一行 Queries 意思是 我要请求的url www.imooc.com 的ip 是多少?

答案是: 第一行 Response in 65 意思是 当前请求的 ip 的结果 response 在65号包里面。

然后我们再看看65号包里的信息:还是看两张图里的标记:

可以看到 65号包 走的是 DNS协议, 第三行可以看到 Src 是 DNS服务器的地址, 而Dst 的 ip 地址 恰好是之前 我电脑的ip地址。

然后直接看第五行 response 里的数据。

第一行又是 request in 64 意思是 下面的数据 是64号包发出的请求得来的。

可以看出每个包的数据都记录了它是几号包发出的请求,或是 几号包的相应。

可以看到,相应的信息里说到 我请求的是 www.imooc.com 的地址。 然后对应的 ip 地址 有三个 , 然后我们可以看到 上面的66号包发出的 请求 的ip 地址是:

115.182.41.180 这个地址。

然后我们看找到了 慕课网的ip地址后 是如何发起请求的。

可以看到 66 67 68 三个包的 我所给的标记, 很明显的就可以看出 这是在进行三次握手了。 图下面给出的信息: 请求的是 80 端口, sequence number : 0 意思是 这是滑动窗口协议的 第 0 号包。包的编号。

看看我们发起的第一次握手 ,请求的包:

Tcp Segment len 是 0 意思是,除去Tcp 的头信息外,它的内容是 0 ;

Acknowledgment number 0 意思是我希望请求到你发出的 第 0 号包,就是我们发出握手请求,想得到慕课网的回应,那么慕课网的第一次回应就是 0 。 当我们第三次握手的时候, 我们就希望慕课网下次 开始给我们发数据了,那就是第 1 号包了。 不知道这么解释 观众老爷是否看得懂。。

flags 是 代表连接的请求,

Window size value 65535 意思就是 滑动窗口的大小是 65535.

看第二次握手:

flags 变成了 SYN, ACK 这懂的都懂。

慕课网设置的滑动窗口的大小是 14480;

第三次握手的包:

第三次握手的包就很简单了。可以看到三次握手建立连接后。 马上就开始通过HTTP请求发送信息了。

此刻终于明白了一点,Tcp ip 跟 HTTP 的关系了: HTTP 本身是无状态的协议, 而Tcp ip 是有状态的协议。 我们网络之间的信息传输,就是靠着是一层一层协议的封装,所做到的了。 虽然我打出的这段文字,之前也在其他地方看到了,但只是自己真的体会了这个过程才能深刻的明白这个道理……

于是又通过 HTTP 请求 发送 Tcp 的包了

我们先看看HTTP 的头信息:

我想 这大家应该再熟悉不过了。 使用的是HTTP 1.1 这个协议版本,get请求。

开始发送包数据就没有什么好说的啦, 无非就是在滑动窗口的机制上,记录你发了什么数据过来,我又收到了你哪些数据,收到了就确认ack, 有时候是一个包就一个ack 有时候是两个包一次ack。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

"LollipopGo/library/lollipop/common" 测试3

Golang语言社区 开源轻量级web应用框架,可以快速创建博客及商城等

4889
来自专栏SDNLAB

OpenDaylight与Mininet应用实战之三层转发机制四

本文属于该专题中的进阶篇,主要讲解ODL应用不同网段的三层数据转发机制,在OpenDaylight与Mininet应用实战之流表操作(三)中会涉及到相同网段的二...

4806
来自专栏owent

Android和IOS的TLS问题

这个问题起源于以前给客户端写的一个log模块,然后里面为了线程安全且多线程下不互相写乱,并且因为这些系统基本都用比较高版本的编译器,都支持C++11了,所以就用...

961
来自专栏hotqin888的专栏

beego操作session

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1041
来自专栏刘望舒

Android Apk安装过程解析

静默安装 apk安装流程简析 installd进程意义 最近工作上遇到静默安装相关的内容,顺便学习一下apk安装的知识

2226
来自专栏蘑菇先生的技术笔记

Go中链路层套接字的实践

接上次的博客,按照约定的划分,还有一层链路层socket。这一层就可以自定义链路层的协议头部(header)了,下面是目前主流的Ethernet 2(以太网)标...

1182
来自专栏nummy

Grunt快速入门

Grunt是基于JavaScript的命令行构建工具,它可以帮助开发者们自动化重复性的工作。你可以把它看成是JavaScript下的Make或者Ant。它可以完...

862
来自专栏Golang语言社区

Go语言的网络编程简介

本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。 TCP 服务器 首先来看一个 TCP 服务...

36815
来自专栏Golang语言社区

Go语言的网络编程简介

本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。 TCP 服务器 首先来看一个 TCP 服务...

4297
来自专栏python3

bs4爬虫实战二:获取双色球中奖信息

访问双色球网站:http://www.zhcw.com/ssq/kaijiangshuju/index.shtml?type=0

982

扫码关注云+社区