OSI 七层参考模型几个小问题

2015-07-03 21:26:06 +08:00
 vtexfan

每次看TCP/IP相关的书籍,第一章就看不下去了,很几个问题希望熟悉的帮解答下:

1.HTTP协议和TCP协议为什么不是在同一层呢?HTTP是表示层的东西,TCP是传输层的东西,那比如网页浏览器,它用的什么协议呢?用抓包工具抓到的HTTP,但根据书上讲的,传输的时候是用TCP或UDP中的一种对吧?这个概念不是很懂

2.一个网络应用程序,它应该没用到表示层的任何东西吧?那这时候表示层的作用是什么呢?其实,这个问题和第一个问题差不多。主要是对每层的作用不是很懂。

3.能不能以通俗、白话的方式讲讲七层每层的作用,拿浏览器或者一个普通的聊天程序举例。

4.tcp/ip和OSI七层模型的分层是不一样的,有什么区别吗?比如应用层、表示层、会话层合并成tcp/ip的应用层,以前三层的东西在这一层中完成?

5.谢谢!小白问题误笑!希望帮解答下,再次表示感谢!

3083 次点击
所在节点    互联网
15 条回复
wy315700
2015-07-03 21:30:36 +08:00
1 OSI 七层模型只是一个理论上的东西 并没有被实施
2 现在广泛使用的是TCP/IP协议,没有表现层,传输层上面就是应用层。
3 HTTP协议是包在TCP里的一个协议,你可以理解成一个瓶子里装了酒。
gamexg
2015-07-03 21:44:41 +08:00
可以理解为一层层的套信封,TCP信封里面是http信封,http信封里面才是内容。TCP信封外面是链路层信封。

每层都有自己的收件地址,发件地址。
hahasong
2015-07-03 21:47:47 +08:00
一说有7层,另一说有4层,这些都只是逻辑上的分层而已。其实你理解4层的就好了
7层:物理层,数据链接层,网络层,传输层,会话层,表示层,应用层
4层:物理层 网络层 传输层 应用层

高层包装了低层,相当于JAVA里面的流的包装类
1.ip协议是网络层,tcp是传输层协议。http是包装了tcp,是应用层的协议,应用层可以理解成软件自己定义的协议。而tcp只是网卡上认的协议,更底层一些。知道俄罗斯套娃不,外层的娃娃就代表高级的协议。最里边的表示低级的物理层协议。依次类推。当软件从应用层发送数据的时候,应用层的协议被编码成网络层的协议,网络层的协议再编码成物理层的协议,直到最后编码成网线里的二进制电流
发送出去。接收方接收的时候顺序相反,接收到二进制电流后,先解包成网络层协议,然后网络层协议被解码成应用层协议。最后软件在从应用层协议的返回里取回数据。
2.你当会,表,应都是应用层就可以了
3,4,5 tcp/ip协议这本书老厚了,又枯燥。我也是小白,反正这么理解,基本上就懂了
Biwood
2015-07-03 21:53:14 +08:00
出门左转维基百科: https://en.wikipedia.org/wiki/OSI_model

另外,HTTP 是应用层好吧。
不同的抓包工具抓缺的结果也不同啊,Filddler 就是抓 HTTP 的数据,Wireshark 可以抓传输层的数据。
vtexfan
2015-07-03 22:52:58 +08:00
谢谢楼上几位兄弟,你们都太棒了。不过你们说的都有点晦涩,我脑筋不太好,还是有点不太明白。
@hahasong 兄的解释,我就差那么一点点就能完全理解了。让我再仔细琢磨琢磨。
akira
2015-07-03 23:47:21 +08:00
HTTP是在TCP的上层,TCP告诉你传了一堆数据,HTTP则告诉你这堆数据是啥。所以你抓浏览器的包,发现是TCP协议完全没有任何冲突的地方。
lk09364
2015-07-03 23:53:59 +08:00
这个是 TCP 包:


而 HTTP 在上图的 Data 里面。

Image from http://liangjiabin.com/blog/2015/03/difference-between-tcp-vs-udp-protocol.html
fzinfz
2015-07-03 23:56:29 +08:00
$ netstat -ltup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:http *:* LISTEN -
tcp 0 0 *:ssh *:* LISTEN -
udp 0 0 *:ntp *:* -
vtexfan
2015-07-04 02:20:23 +08:00
谢谢楼上三位!
@akira 兄,你这么说我好像明白了点什么,快要开窍了。那如果一个普通的网络应用程序,没用到HTTP之类的这种协议,就传输一个字符串"hello",那谁来告诉的这堆数据是啥?你明白我的意思吗?
qw7692336
2015-07-04 04:15:34 +08:00
不用那么麻烦,你找个抓包工具,抓一下传输层的包(TCP包),就懂了。我就是在玩过抓包之后秒懂的。你开chrome的开发者选项,切换到network拦,对比跟抓包工具抓到的包对比一下。之后你可以试着用telnet去发送HTTP请求。这时你应该知道TCP和HTTP之间的关系了。
ryd994
2015-07-04 08:46:20 +08:00
严格来说,我们传输的数据,其实都是在网线上的电信号而已。然而,如果写个网页也要先从门电路写起的话估计程序员都要上吊了。7层模型是说网络上传输的数据可以在7个抽象层次上考虑。这样每一层都只要完成有限的职责即可,方便思考。比如Web程序员就不需要太多考虑TCP的事(当然优化的时候还是要的,然而不懂TCP,程序也能跑),比如写个网游客户端就不需要考虑ARP查询。


7层模型只是一种思考方式,方便交流而已。并非网络就一定有7层或者只有7层,全看个人怎么理解。实际的概念是很模糊的。

能明白浏览器、路由器、交换机、HUB其实是在合作完成同一个任务,但不是在做同样的事情,就可以了。
jasontse
2015-07-04 13:10:09 +08:00
TCP 和 HTTP 并不冲突。和对方主机的 TCP 80 建立连接,上面传的东西是 HTTP。
你的抓包工具只是识别出里面是 HTTP 的内容,然后以更友好的方式给你看。
zeroday
2015-07-05 09:06:21 +08:00
HTTP 协议是 Web 工作的核心。

HTTP 是通过 Internet 进行接受和发送数据的协议。它是在 TCP 协议之上,一般采用 TCP 的80端口。它是一种请求-响应的协议,浏览器客户端发送请求,服务器接受到数据后产生响应。

在 HTTP 中,客户端通过一个连接和发送请求作为一个事务。服务器不能主动连接客户端,也不能给服务器发送一个回调连接。客户端与服务器都可以中断连接。

HTTP 协议是一种无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的。对于 HTTP 服务器,是不能识别两次请求是来自同一个客户端的。为了解决这一问题,Web 程序引入了 Cookie 来维护连接的可持续。
vtexfan
2015-07-05 14:53:14 +08:00
谢谢各位。前面的弄懂了,又产生了很多新问题,目前在啃书中。
akira
2015-07-05 16:54:51 +08:00
@vtexfan 这时候,这个数据格式就是由应用程序自己定义的了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/203170

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX