网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

03丨套接字和地址:像电话和电话号码一样理解它们

思考题
总结
套接字地址格式
socket的发展历史
更好地理解socket:一个更直观的解释
socket到底是什么?
套接字和地址

该思维导图由 AI 生成,仅供参考

在网络编程中,我们经常会提到 socket 这个词,它的中文翻译为套接字,有的时候也叫做套接口。
socket 这个英文单词的原意是“插口”“插槽”, 在网络编程中,它的寓意是可以通过插口接入的方式,快速完成网络连接和数据收发。你可以把它想象成现实世界的电源插口,或者是早期上网需要的网络插槽,所以 socket 也可以看做是对物理世界的直接映射。
其实计算机程序设计是一门和英文有着紧密联系的学科,很多专有名词使用英文原词比翻译成中文更容易让大家接受。为了方便,在专栏里我们一般会直接使用英文,如果需要翻译就一律用“套接字”这个翻译。

socket 到底是什么?

在网络编程中,到底应该怎么理解 socket 呢?我在这里先呈上这么一张图,你可以先看看。
这张图表达的其实是网络编程中,客户端和服务器工作的核心逻辑。
我们先从右侧的服务器端开始看,因为在客户端发起连接请求之前,服务器端必须初始化好。右侧的图显示的是服务器端初始化的过程,首先初始化 socket,之后服务器端需要执行 bind 函数,将自己的服务能力绑定在一个众所周知的地址和端口上,紧接着,服务器端执行 listen 操作,将原先的 socket 转化为服务端的 socket,服务端最后阻塞在 accept 上等待客户端请求的到来。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

套接字在网络编程中扮演着重要角色,类似于电话和电话号码的概念。文章首先介绍了套接字的基本概念和工作原理,包括服务器端和客户端的初始化、连接建立、数据传输和断开连接的过程。作者通过图示和打电话的类比,生动形象地解释了套接字的作用和使用方式。此外,文章还回顾了套接字的发展历史,指出它最早由加州大学伯克利分校的研究人员提出,并成为网络互联互通的标准。在讨论套接字地址格式时,文章介绍了通用套接字地址结构和不同地址族的含义,为读者提供了更深入的理解。整体而言,本文通过生动的类比和清晰的技术讲解,帮助读者快速了解套接字的概念和使用方法,适合对网络编程感兴趣的读者阅读。文章还介绍了IPv4和IPv6套接字地址格式的结构,以及本地套接字格式的特点。通过对比不同地址格式的特点,读者可以更好地理解套接字的设计和使用。同时,文章提出了思考题,引导读者深入思考不同套接字格式的共性和设计原因。这篇文章对于初学者快速了解套接字概念和技术特点具有很好的指导作用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(81)

  • 最新
  • 精选
  • 业余爱好者
    置顶
    unix系统有一种一统天下的简洁之美:一切皆文件,socket也是文件。 1.像sock_addr的结构体里描述的那样,几种套接字都要有地址族和地址两个字段。这容易理解,你要与外部通信,肯定要至少告诉计算机对方的地址和使用的是哪一种地址。与远程计算机的通信还需要一个端口号。而本地socket的不同之处在于不需要端口号,那么就有了问题2; 2.本地socket本质上是在访问本地的文件系统,所以自然不需要端口。远程socket是直接将一段字节流发送到远程计算机的一个进程,而远程计算机可能同时有多个进程在监听,所以用端口号标定要发给哪一个进程。

    作者回复: 回答的很好,给你点赞

    2019-08-07
    9
    221
  • 奔跑的码仔
    个人感觉“Pv4、IPv6、本地套接字格式以及通用地址套接字”的思想类似于OOP中的继承和多态。通用套接子为抽象类,其他套接字实现该抽象类。这样,可以定义基于通用套接字这个抽象类各种通用接口,其他套接字,也就是具体类,可以完全复用这套接口,即,实现了socket编程的多态!

    作者回复: 这个理解我给满分。

    2019-08-10
    7
    56
  • conanforever22
    1. 我觉得这样设计的目的是为了给用户提供一个统一的接口, 不用每个地址族成员都增加个函数原型; 只用通过sockaddr.sa_family来确定具体是什么类型的地址, 有点工厂模式的意思; 如果是C++的话就可以用函数重载来实现了 2. socket主要还是为了进程间通信, 本地套接字主要用于本地IPC, 网络套接字用于跨机器通信; 如果把socket抽象成文件的话, 通信进程双方需要能够根据一个唯一的fd来找到彼此, 跨机器的话可以用端口, 本地的话直接用文件inode就可以了

    作者回复: 你的理解很到位,工厂模式我倒是没有仔细想过,有点独辟蹊径

    2019-08-07
    2
    41
  • nil
    第一问,通用网络地址结构是所有具体地址结构的抽象,有了统一可以操作的地址结构,那么就可以涉及一套统一的接口,简化了接口设计。通用地址结构中第一个字段表明了地址的类型,后面的数据可以通过具体类型解析出来,一般只有将具体地址类型的指针强制转化成通用类型,这样操作才不会造成内存越界。 第二问,本地socket基于文件操作的,因此只需要根据文件路径便可区分,不需要使用端口的概念。

    作者回复: 正解

    2019-08-07
    3
    30
  • xcoder
    老师能讲下关于WebSocket、Http和socket之间的联系吗?

    作者回复: Http是应用层协议,是基于Tcp socket的实现,websocket是http的增强,利用了Tcp双向的特性,增强了服务器端到客户端的传输能力 以前客户端是需要不断通过轮询来从服务端得到信息,使用websocket以后就可以服务端直接推送信息到客户端

    2019-08-07
    4
    28
  • Mark
    AF_xxx 这样的值来初始化 socket 地址,用 PF_xxx 这样的值来初始化 socket。 请教老师,这一句具体怎么理解?

    作者回复: //socket地址初始化 servaddr.sin_family = AF_INET; //socket初始化 listenfd = socket(PF_INET, SOCK_STREAM, 0);

    2019-09-12
    4
    25
  • Sweety
    打卡。感觉评论区的人都好厉害。

    作者回复: 我也觉得

    2019-08-07
    12
  • 衬衫的价格是19美元
    通用地址格式sockaddr长度只有16字节,实际存放ip地址的只有14字节,怎么存的下ip6的地址的?这里还是不太明白

    作者回复: 实际上这个通用地址格式,你可以理解为void *,我在文章里也指出了,设计套接字的时候,还没有提供void *类型的指针,所以用通用地址格式来表示。 在IPV6地址时,实际上传入的还是28个字节的数据,通用地址只是一个"参数类型",在函数处理时,实际上可以根据AF_xxx的类型来判断,真正的地址是IPV6,那么是28个字节的数据需要被使用,而不是16个字节。

    2019-09-30
    5
    10
  • Linuxer
    2字节表示地址族很富裕,知道地址族,基本确定地址结构,通用地址结构,能够很好区分这两部分,一个字符数组就能知道每一种地址结构的起始地址,高明

    作者回复: 回答的也很高明

    2019-08-07
    2
    9
  • 评论区都是高手,不过只输入不输出,脑袋是容不下的。所以,先不管对错,也记一下自己的思考。 感觉电脑一多,脑袋就乱,我来简化一下 如果世界上只有一台,那网络通信也就不需要了,不过单独的这台电脑上的文件,只要知道路径应该是能访问的,所以,不需要什么IP和端口 如果世界上只有两台电脑,并且每台电脑上可以运行多个进程,如果这两台电脑上的两个进程间想通信,那就需要端口号了,否则定位不了唯一的进程 如果世界上只有三台电脑,并且每台电脑上可以运行多个进程,其中有两台电脑上的进程之间想通信,那么就需要有IP和端口号了,IP用于定位电脑,端口号用于定位进程 世界上只有三台电脑,其实可以扯三根网线,此时长链接也是很容易理解的,实际上现在世界上有上亿级的电脑都在互联网上,如果两两互联都通过专有的网线,那这网线的数量就是个天文数字,也不现实。此时,这个长链接是怎么维护的,有些线路必然会公用的,我有些想不明白,分时公用?还是有个特殊标志?或者线路本身就是无时无刻都在公用的?

    作者回复: 长链接并不是一直占用的一条物理链路哦,它实际上只是分配了固定的资源,可以维护通信双方在一定时间内的"逻辑"链路。

    2019-11-19
    6
    6
收起评论
显示
设置
留言
81
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部