趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

43 | Socket通信:遇上特大项目,要学会和其他公司合作

sin_addr
sin_port
sin_family
UDP
TCP
三次握手
listen函数
sockaddr_in
sockfd
protocol
type
domain
传输层协议
TCP协议的socket调用过程
用户态和内核态接口
recvfrom
sendto
write
read
connect函数
accept
连接建立
监听
bind函数
关闭socket
socket函数
分层机制
课堂练习
socket系统调用
通信
bind
数据传输
客户端
服务端
socket接口
总结
UDP编程
TCP编程
应用层通信
Socket通信

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

上一篇预习文章说了这么多,现在我们终于可以来看一下,在应用层,我们应该如何使用 socket 的接口来进行通信。
如果你对 socket 相关的网络协议原理不是非常了解,建议你先去看一看上一篇的预习文章,再来看这一篇的内容,就会比较轻松。
按照前一篇文章说的分层机制,我们可以想到,socket 接口大多数情况下操作的是传输层,更底层的协议不用它来操心,这就是分层的好处。
在传输层有两个主流的协议 TCP 和 UDP,所以我们的 socket 程序设计也是主要操作这两个协议。这两个协议的区别是什么呢?通常的答案是下面这样的。
TCP 是面向连接的,UDP 是面向无连接的。
TCP 提供可靠交付,无差错、不丢失、不重复、并且按序到达;UDP 不提供可靠交付,不保证不丢失,不保证按顺序到达。
TCP 是面向字节流的,发送时发的是一个流,没头没尾;UDP 是面向数据报的,一个一个地发送。
TCP 是可以提供流量控制和拥塞控制的,既防止对端被压垮,也防止网络被压垮。
这些答案没有问题,但是没有到达本质,也经常让人产生错觉。例如,下面这些问题,你看看你是否了解?
所谓的连接,容易让人误以为,使用 TCP 会使得两端之间的通路和使用 UDP 不一样,那我们会在沿途建立一条线表示这个连接吗?
我从中国访问美国网站,中间这么多环节,我怎么保证连接不断呢?
中间有个网络管理员拔了一根网线不就断了吗?我不能控制它,它也不会通知我,我一个个人电脑怎么能够保持连接呢?
还让我做流量控制和拥塞控制,我既管不了中间的链路,也管不了对端的服务器呀,我怎么能够做到?
按照网络分层,TCP 和 UDP 都是基于 IP 协议的,IP 都不能保证可靠,说丢就丢,TCP 怎么能够保证呢?
IP 层都是一个包一个包地发送,TCP 怎么就变成流了?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在特大项目中如何利用socket进行通信,着重讨论了TCP和UDP两种协议的使用。文章首先解释了TCP和UDP的区别,包括面向连接、可靠交付、流量控制和拥塞控制等特点。接着详细介绍了使用socket函数创建和关闭socket的过程,以及针对TCP和UDP分别进行编程的步骤。对于TCP,包括服务端的监听、连接建立和数据传输的过程;对于UDP,介绍了不需要连接维护的特点,以及发送和接收数据的方法。文章还涉及了网络字节序的问题和三次握手的过程。通过实际的代码和流程介绍,帮助读者了解了在特大项目中如何使用socket进行通信,特别是针对TCP和UDP协议的编程细节。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • 莫名
    『连接功夫在两端,而不在通路。通过两端的底层sock结构体维持状态信息。』老师这句话总结很到位结合socket系统调用的源码分析会更加容易理解。

    作者回复: 是的

    2019-08-29
    17
  • 程序水果宝
    为什么要两个socket?

    作者回复: 需要两个数据结构保存不同的状态

    2019-07-11
    12
  • 韩俊臣
    撑过进程间通信后,这里终于多少能看懂了

    作者回复: 赞

    2020-06-14
    4
  • kdb_reboot
    老师厉害了, 依然在更新; 最近我有时间学习这个专栏了, 但是目前只跟到第十课, 把专栏作为引子,每天的阅读量还是很大的 然后, 我有个问题: 专栏更新完老师还会答疑吗?因为进度原因,可能还没学到最后面,专栏已经更新完了

    作者回复: 这个专栏比较硬核

    2019-07-05
    4
  • oldman
    老师,有个问题,一直没有想明白,希望老师看到之后给解答一下,我知道服务端会维护一个连接的队列,比如这个队列里面是a,b,c,d,e,f,g这个样的多个连接,那当客户端有请求过来,比如说某一个请求过来,服务端是怎么区分他是a还是b或者c对应的连接呢?谢谢。

    作者回复: 每个连接都是不同的端口号

    2019-08-08
    3
  • 潇是潇洒的洒
    老师我有一个疑问,服务端和客户端都调用 socket,得到文件描述符。这里是服务端和客户端分别打开了不同的文件,然后各自写对方的文件,读自己的文件,还是说打开是同一个文件,读和写。

    作者回复: 不同的文件

    2019-09-02
  • 咖啡猫口里的咖啡猫🐱
    其实我对tcp和udp的理解就是tcp协议栈由分段maxsegment(握手阶段的附加),自己尽量来处理最大MTU问题,尽量防止ip分片,对端网络层组包,从而导致的tcp应用使用协议需要考虑处理分包,粘包。

    作者回复: 可以offload给硬件

    2019-07-18
  • 安排
    老师,可不可以在答疑篇,增加一个select,poll,epoll的内核机制分析?
    2019-07-05
    5
    65
  • 天使也有爱
    看了趣谈网络协议专栏,在结合这里看,感觉对网络通信知识有了更深的理解
    2019-09-22
    2
  • Allen_
    这一章解决了我一年都问不到的答案 谢谢老师
    2021-03-06
    1
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部