学习tcp/ip有几个月了,准备把自己所学的东西总结总结,当作一个备忘录,留做以后参考,由于本人才疏学浅,刚刚开始研究网络,肯定有许多想的不对或者不周到的地方,希望看到错误的朋友,高手们多多指教,小弟在此先谢过了.
个人觉得,刚学习tcp/ip,最简单也是最基础的,应该弄明白两台主机进行通讯时,数据报在通过协议栈时是如何被处理的,这也是本篇博文的主题.
背景环境如下图:
问题描述:
Host X要通过浏览器从Server Y上的web service下载一个html页面.
通讯的过程简单如下:
Host X端:
1)应用层:
浏览器通过读取用户输入的url地址,通过dns转换为ip地址,即目标的ip地址,这里假设为208.201.237.37.这样,浏览器在应用层就发起一个与208.201.237.37的http会话,,然后通过tcp与目标主机上的web service进行通讯.
2)传输层
传输层通过一定的规则把http消息请求变成segment,如果需要,为每个segment都加上一个tcp头,然后加上源和目的端口号,因为是http,所以默认的目的地址端口号是80.
3)网络层
网络层主要关心与ip地址相关的信息,检查packet的ip地址和相关信息,然后根据路由表决定数据报的下一跳地址,这里是RT1,然后给数据报打上ip头,然后根据neighbor protocol找到对应ip地址的mac地址,把包传下去.
4)链路层
此层最常见的是以太网,为数据报打上mac头,不同的连接有不同的mac头.
此后由于在ip层通过路由表找到了下一跳地址,即RT1路由器地址,所以数据报被发送到RT1.
数据报到达路由器后的处理过程如下:
通过mac头中的信息,可以看到L3层协议是ip协议,然后去掉mac头,检查目的ip地址是否是本地ip地址,如果不是则根据路由表,找到下一跳地址,然后重新打上mac头,发往下一跳.根据连接方式的不同,此时重新封装的mac头可能不同.
直到数据报到达目的主机后,通过协议栈交给web service应用程序.过程如下:
1)链路层
数据报到达后,剥离mac头,从mac头中可以看到L3层用的是ip,于是通过适当的函数,将数据报发送到ip层.
2)网络层
网络层知道本地主机的ip地址,看到数据报的目的ip是本机地址后,把数据报传给上层,网络层剥离ip头,从中可知道L4对应的协议和相应的处理函数,把数据报传递到上层.
3)传输层
剥离tcp头,根据目的端口号找到对应的应用程序,由于端口号为80,所以将原数据报发到web server.此时一次单向通讯过程结束.
从Server Y到Host X的过程类似.
总体过程见下图:
注意:
1)除传输层,每层协议头中都包含有上层具体协议,以指示接收数据报时的数据走向.比如ip头中有tcp协议信息等等.
2)不同的链路层的mac头不一样,比如图中从Host X到RT1,从RT1到RT2的mac头,注意下.(图d和e)