V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abug
V2EX  ›  程序员

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

  •  
  •   abug · 2020-01-31 22:04:05 +08:00 · 5080 次点击
    这是一个创建于 1740 天前的主题,其中的信息可能已经有所发展或是发生改变。
    求解惑
    15 条回复    2020-02-02 16:14:07 +08:00
    fyyz
        1
    fyyz  
       2020-01-31 22:21:11 +08:00
    socket 是 tcp 连接,http 是建立在 tcp 连接上的
    BingoXuan
        2
    BingoXuan  
       2020-01-31 22:31:26 +08:00
    根据 osi 分层,socket 属于传输层,http 属于应用层。

    就如 socket 是连接你我的管道,但管道中传送东西流程和规范的最佳实践之一就是 http
    iceheart
        3
    iceheart  
       2020-01-31 23:32:52 +08:00 via Android
    大概类似快递跟汽车的关系吧
    railgun
        4
    railgun  
       2020-01-31 23:46:49 +08:00
    附加题,socket 和 tcp 有什么区别和联系?
    WordTian
        5
    WordTian  
       2020-01-31 23:56:18 +08:00 via Android   ❤️ 1
    socket 只有选择 INET 系列协议族,且选择流模式,才可能和 http 协议发生联系。就不是一个层次的东西,区别太大,很难并列到一起说的
    jinliming2
        6
    jinliming2  
       2020-02-01 00:35:20 +08:00 via iPhone
    socket 是一种特殊的文件,这种文件又分为 TCP、UDP、SCTP 等几种类型。
    在 C 语言中使用 socket 函数来创建一个 socket,在创建 socket 的时候,参数中需要指明 socket 的类型是 TCP、UDP 还是 SCTP 等。
    jinliming2
        7
    jinliming2  
       2020-02-01 00:38:22 +08:00 via iPhone
    HTTP 则是 建立在应用层的一种协议,它下面可以是由 TCP 来支撑也可以由 UDP 来支撑,或者在 UnixSock 中也可以使用 HTTP 协议。
    也就是说,HTTP 本质上与 TCP、UDP 这些 socket 没有太大的关联。
    xuanbg
        8
    xuanbg  
       2020-02-01 09:11:06 +08:00
    http 是应用层传输协议,socket 是计算机利用传输层协议(tcp/udp)建立的链接。先建立 socket,然后才能通 http。如果 http 是集装箱,那 socket 就是铁路。
    andj4cn
        9
    andj4cn  
       2020-02-01 09:37:21 +08:00
    socket 只是传输层的统一 API 接口规范。HTTP 是应用层传输协议,应用层的实现基于传输层,在实际代码实现中,HTTP 协议的代码实现需要调用传输层的 API,因此代码中 HTTP 协议实现使用的是 socket。
    qakito
        10
    qakito  
       2020-02-01 09:41:27 +08:00   ❤️ 3
    HTTP 是基于 TCP 的应用层协议,由 RFC 定义;
    socket 是现代操作系统提供的网络通信 API,由 POSIX 定义;所有的网络通信需要通过 API 来完成,包括 HTTP。
    另一套网络通信 API 是 sysv STREAMS。
    abug
        11
    abug  
    OP
       2020-02-01 15:29:04 +08:00
    @xuanbg 之前被面试的时候,我也是这么说的,我是 http 基于 socket,面试官说(加重语气) http 基于 socket?好像就这个问题那次就 gg 了
    nightwitch
        12
    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
        13
    Xiweini  
       2020-02-02 14:22:12 +08:00
    socket 是 Linux 内核的一个内核功能, Windows NT 里面是叫 Winsock, 用户态中任何和网络有关的功能基本都要有个 system call, call 这个 socket APi
    liuxingdeyu
        14
    liuxingdeyu  
       2020-02-02 14:54:35 +08:00
    socket 简单说就是 ip+port,ip 用来找到主机,port 用来找到程序,这样你的包就能找到主机和程序,再往上加规则就是 tcp 或者 udp 这层的协议,但是这俩响度还是比较抽象。http 就是利用现成的 tcp 或者 udp 再封装一层,本来是用来传超文本的,现在越来越复杂来。。。
    laoheshanjigong
        15
    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 屏蔽了这些抽象。使得对于上层的呈现使用同一的语义。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2573 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:02 · PVG 08:02 · LAX 16:02 · JFK 19:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.