问一个面试题 http 和 socket 有什么区别和联系

2020-01-31 22:04:05 +08:00
 abug
求解惑
4896 次点击
所在节点    程序员
15 条回复
fyyz
2020-01-31 22:21:11 +08:00
socket 是 tcp 连接,http 是建立在 tcp 连接上的
BingoXuan
2020-01-31 22:31:26 +08:00
根据 osi 分层,socket 属于传输层,http 属于应用层。

就如 socket 是连接你我的管道,但管道中传送东西流程和规范的最佳实践之一就是 http
iceheart
2020-01-31 23:32:52 +08:00
大概类似快递跟汽车的关系吧
railgun
2020-01-31 23:46:49 +08:00
附加题,socket 和 tcp 有什么区别和联系?
WordTian
2020-01-31 23:56:18 +08:00
socket 只有选择 INET 系列协议族,且选择流模式,才可能和 http 协议发生联系。就不是一个层次的东西,区别太大,很难并列到一起说的
jinliming2
2020-02-01 00:35:20 +08:00
socket 是一种特殊的文件,这种文件又分为 TCP、UDP、SCTP 等几种类型。
在 C 语言中使用 socket 函数来创建一个 socket,在创建 socket 的时候,参数中需要指明 socket 的类型是 TCP、UDP 还是 SCTP 等。
jinliming2
2020-02-01 00:38:22 +08:00
HTTP 则是 建立在应用层的一种协议,它下面可以是由 TCP 来支撑也可以由 UDP 来支撑,或者在 UnixSock 中也可以使用 HTTP 协议。
也就是说,HTTP 本质上与 TCP、UDP 这些 socket 没有太大的关联。
xuanbg
2020-02-01 09:11:06 +08:00
http 是应用层传输协议,socket 是计算机利用传输层协议(tcp/udp)建立的链接。先建立 socket,然后才能通 http。如果 http 是集装箱,那 socket 就是铁路。
andj4cn
2020-02-01 09:37:21 +08:00
socket 只是传输层的统一 API 接口规范。HTTP 是应用层传输协议,应用层的实现基于传输层,在实际代码实现中,HTTP 协议的代码实现需要调用传输层的 API,因此代码中 HTTP 协议实现使用的是 socket。
qakito
2020-02-01 09:41:27 +08:00
HTTP 是基于 TCP 的应用层协议,由 RFC 定义;
socket 是现代操作系统提供的网络通信 API,由 POSIX 定义;所有的网络通信需要通过 API 来完成,包括 HTTP。
另一套网络通信 API 是 sysv STREAMS。
abug
2020-02-01 15:29:04 +08:00
@xuanbg 之前被面试的时候,我也是这么说的,我是 http 基于 socket,面试官说(加重语气) http 基于 socket?好像就这个问题那次就 gg 了
nightwitch
2020-02-01 17:25:53 +08:00


http 是在最上面的 Application Layer 应用层的协议,一般是基于 TCP 实现。把这两个连起来的 socket 类型叫做 Internet Domain SOCK_STREAM。除了这种类型以外 socket 还有其他类型。

Internet Domain socket 是基于 TCP/UDP(忽略 raw socket)的一种连接方式,是把应用层协议和传输层连起来的一种方式。除了 Internet Domain socket 以外还有 Unix Domain socket, 通信不走 tcp/ip, 走内核。
Xiweini
2020-02-02 14:22:12 +08:00
socket 是 Linux 内核的一个内核功能, Windows NT 里面是叫 Winsock, 用户态中任何和网络有关的功能基本都要有个 system call, call 这个 socket APi
liuxingdeyu
2020-02-02 14:54:35 +08:00
socket 简单说就是 ip+port,ip 用来找到主机,port 用来找到程序,这样你的包就能找到主机和程序,再往上加规则就是 tcp 或者 udp 这层的协议,但是这俩响度还是比较抽象。http 就是利用现成的 tcp 或者 udp 再封装一层,本来是用来传超文本的,现在越来越复杂来。。。
laoheshanjigong
2020-02-02 16:14:07 +08:00
http 是超文本传输协议,是一种应用层协议。
socket 是网络编程中的一种抽象。

所以它们并不是同一类东西。

http:
超文本传输协议,一种应用层协议。

socket:
一种编程抽象。
按照 linux 的 socket 的抽象定义: http://man7.org/linux/man-pages/man2/socket.2.html

socket 支持了 本地通讯,ipv4 ipv6, 等等不同网络层协议。
和 tcp upd 等等不同的传输层协议。

socket 屏蔽了这些抽象。使得对于上层的呈现使用同一的语义。

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

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

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

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

© 2021 V2EX