当我输入 一个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。