趣谈网络协议
刘超
网易研究院云计算技术部首席架构师
立即订阅
37978 人已学习
课程目录
已完结 51 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 想成为技术牛人?先搞定网络协议!
免费
第一模块 通信协议综述 (4讲)
第1讲 | 为什么要学习网络协议?
第2讲 | 网络分层的真实含义是什么?
第3讲 | ifconfig:最熟悉又陌生的命令行
第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的?
第二模块 底层网络知识详解:从二层到三层 (5讲)
第5讲 | 从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?
第6讲 | 交换机与VLAN:办公室太复杂,我要回学校
第7讲 | ICMP与ping:投石问路的侦察兵
第8讲 | 世界这么大,我想出网关:欧洲十国游与玄奘西行
第9讲 | 路由协议:西出网关无故人,敢问路在何方
第二模块 底层网络知识详解:最重要的传输层 (4讲)
第10讲 | UDP协议:因性善而简单,难免碰到“城会玩”
第11讲 | TCP协议(上):因性恶而复杂,先恶后善反轻松
第12讲 | TCP协议(下):西行必定多妖孽,恒心智慧消磨难
第13讲 | 套接字Socket:Talk is cheap, show me the code
第二模块 底层网络知识详解:最常用的应用层 (4讲)
第14讲 | HTTP协议:看个新闻原来这么麻烦
第15讲 | HTTPS协议:点外卖的过程原来这么复杂
第16讲 | 流媒体协议:如何在直播里看到美女帅哥?
第17讲 | P2P协议:我下小电影,99%急死你
第二模块 底层网络知识详解:陌生的数据中心 (6讲)
第18讲 | DNS协议:网络世界的地址簿
第19讲 | HTTPDNS:网络世界的地址簿也会指错路
第20讲 | CDN:你去小卖部取过快递么?
第21讲 | 数据中心:我是开发商,自己拿地盖别墅
第22讲 | VPN:朝中有人好做官
第23讲 | 移动网络:去巴塞罗那,手机也上不了脸书
第三模块 热门技术中的应用:云计算中的网络 (5讲)
第24讲 | 云中网络:自己拿地成本高,购买公寓更灵活
第25讲 | 软件定义网络:共享基础设施的小区物业管理办法
第26讲 | 云中的网络安全:虽然不是土豪,也需要基本安全和保障
第27讲 | 云中的网络QoS:邻居疯狂下电影,我该怎么办?
第28讲 | 云中网络的隔离GRE、VXLAN:虽然住一个小区,也要保护隐私
第三模块 热门技术中的应用:容器技术中的网络 (3讲)
第29讲 | 容器网络:来去自由的日子,不买公寓去合租
第30讲 | 容器网络之Flannel:每人一亩三分地
第31讲 | 容器网络之Calico:为高效说出善意的谎言
第三模块 热门技术中的应用:微服务相关协议 (5讲)
第32讲 | RPC协议综述:远在天边,近在眼前
第33讲 | 基于XML的SOAP协议:不要说NBA,请说美国职业篮球联赛
第34讲 | 基于JSON的RESTful接口协议:我不关心过程,请给我结果
第35讲 | 二进制类RPC协议:还是叫NBA吧,总说全称多费劲
第36讲 | 跨语言类RPC协议:交流之前,双方先来个专业术语表
第四模块 网络协议知识串讲 (4讲)
第37讲 | 知识串讲:用双十一的故事串起碎片的网络协议(上)
第38讲 | 知识串讲:用双十一的故事串起碎片的网络协议(中)
第39讲 | 知识串讲:用双十一的故事串起碎片的网络协议(下)
第40讲 | 搭建一个网络实验环境:授人以鱼不如授人以渔
答疑与加餐 (9讲)
协议专栏特别福利 | 答疑解惑第一期
协议专栏特别福利 | 答疑解惑第二期
协议专栏特别福利 | 答疑解惑第三期
协议专栏特别福利 | 答疑解惑第四期
协议专栏特别福利 | 答疑解惑第五期
加餐1 | 测一测:这些网络协议你都掌握了吗?
加餐2 | 创作故事:我是如何创作“趣谈网络协议”专栏的?
加餐3 | “趣谈网络协议”专栏食用指南
第2季回归 | 这次我们来“趣谈Linux操作系统”
结束语 (1讲)
结束语 | 放弃完美主义,执行力就是限时限量认真完成
趣谈网络协议
登录|注册

第13讲 | 套接字Socket:Talk is cheap, show me the code

刘超 2018-06-15

前面讲完了 TCP 和 UDP 协议,还没有上手过,这一节咱们讲讲基于 TCP 和 UDP 协议的 Socket 编程。

在讲 TCP 和 UDP 协议的时候,我们分客户端和服务端,在写程序的时候,我们也同样这样分。

Socket 这个名字很有意思,可以作插口或者插槽讲。虽然我们是写软件程序,但是你可以想象为弄一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以在通信之前,双方都要建立一个 Socket。

在建立 Socket 的时候,应该设置什么参数呢?Socket 编程进行的是端到端的通信,往往意识不到中间经过多少局域网,多少路由器,因而能够设置的参数,也只能是端到端协议之上网络层和传输层的。

在网络层,Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设置为 AF_INET 和 AF_INET6。另外,还要指定到底是 TCP 还是 UDP。还记得咱们前面讲过的,TCP 协议是基于数据流的,所以设置为 SOCK_STREAM,而 UDP 是基于数据报的,因而设置为 SOCK_DGRAM。

基于 TCP 协议的 Socket 程序函数调用过程

两端创建了 Socket 之后,接下来的过程中,TCP 和 UDP 稍有不同,我们先来看 TCP。

TCP 的服务端要先监听一个端口,一般是先调用 bind 函数,给这个 Socket 赋予一个 IP 地址和端口。为什么需要端口呢?要知道,你写的是一个应用程序,当一个网络包来的时候,内核要通过 TCP 头里面的这个端口,来找到你这个应用程序,把包给你。为什么要 IP 地址呢?有时候,一台机器会有多个网卡,也就会有多个 IP 地址,你可以选择监听所有的网卡,也可以选择监听一个网卡,这样,只有发给这个网卡的包,才会给你。

© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈网络协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(82)

  • time_qiao
    刘老师看完这节,觉得您的linux功底实在太深厚了,这个系列做完能不能做个linux系列的
    2018-06-21
    1
    145
  • Jealone
    Epoll和IOCP还是有本质区别的,IOCP是封装了IO操作的,而epoll只是一个事件通知机制,意味着IOCP的IO操作也可以由内核完成,因此IOCP算异步IO,而基于epoll的仍然是同步IO,于IOCP相对应的不是epoll而是AIO
    2018-06-15
    44
  • 白杨
    我个人觉得还可以讲的更本质一些。
    不论是同步还是异步,阻塞还是非阻塞,都是用某种方法创建了某种结构,而不同的是,是谁在执行内部的方法,是谁写了标志,是谁触发了事件,是谁在操作io,是谁在等待,是谁在返回。
    换句话说就是,本来我在做的事情,让你来做吧,本来你在做的事情,让我来做吧。
    2018-06-27
    29
  • 零一
    第一个问题,windows 上是 iocp,如果想跨平台,要么使用兼容性较好的 select,要么对不同的平台使用不同的调用,kqueue iocp等。
    第二个问题,HTTP 是构建在 tcp 协议之上的,用 telnet 可以轻松构造一个 HTTP 请求
    2018-06-15
    28
  • 自然而然
    这篇写的很棒,很见功底
    2018-07-21
    9
  • 幻想
    真心写的好。多谢作者。
    2018-06-15
    8
  • 明子
    这章看的很吃力,可能限于篇幅原因,很多细节都没讲清楚。比如,说需要两个socket(监听socket和已连接socket),但没有说为什么需要两个socket,我去查了《Unix 网络编程》才了解原因;而且需要说明的是,只有服务端需要两个socket。

    作者回复: 只讲了模式,细节足够一本书了

    2019-01-09
    7
  • 大光头
    windows上有一个叫iocp,但是它还是有点不一样,它是proactor,而epoll是reactor。我觉得iocp效率会更高,epoll通知应用去读取数据,处理完之后还要返回内核发送数据,而完成端口直接在内核态进行处理数据,最后告诉应用,数据已经处理完了。
    2018-06-15
    6
  • 灵魂胖子
    老师,那个UDP 协议的 Socket 程序函数调用过程中的客户端可以不用调用bind()吧?

    作者回复: 可以

    2018-06-21
    5
  • 灰灰
    老师,对socket这块一直理解比较抽象,什么情况下需要socket编程,我印象中从来没写过。盼复

    作者回复: 很多地方啊,可能都是框架做好了,但是看框架的源代码,还是能看到的

    2018-06-19
    5
  • 咖啡猫口里的咖啡猫🐱
    看完tcp/ip三卷 结合linux操作,再看一遍文章,刚觉老师 linux内核功力深厚。感觉书第二卷实现跟现在内核版本有些😂区别
    2019-02-26
    4
  • caohuan
    听二遍 才懂了一点,通讯里面 确实 内容丰富、技巧很多、设计巧妙。

    本篇所得:1.一台机器有多个网卡,可以选择一个或多个网卡,发送和接受包资源;
    TCP连接数量=客户端的IP数*客户端的端口数,客户端的最大ip为2**32,客户端的端口数最大为 2**16
    ,所以TCP连接总数最大为2**48;

    2.Socket可以包括 监听Socket和已连接Socket;

    3.TCP的Socket连接 核心为:客户端的connect--服务端的accept---客户端的write---服务端的read---服务端的write----客户端的read;
    UDP的Socket连接 内容主要为:客户端send to---服务端recvform---服务端sendto--客户端的recvfrom。

    4.一个服务器可以连接有很多客户端进行通讯:(1)多进程,一个进程一个通讯项目;(2)多线程,一个进程对应对个项目,一个线程负责一个通讯项目;(3)多线程,一个线程负责多个通讯项目,使用轮询监听和描述 通讯的记录;(4)多线程,一个线程负责多个通讯项目,使用 注册 主动通知的方法,使用epoll解决C10k问题。

    回答老师的问题:问题1 linux有epoll,window有类似IOCP,跨平台就不清楚;问题二 http使用tcp协议,使用talnet规则构建。
    2019-01-22
    4
  • 汪木木
    这就是几种网络io的由来,bio,nio1,nio2。
    2018-07-20
    4
  • Hugo
    老师监听的socket和已连接的socket 是每次连接两个都会创建 。
    还是监听的socket只创建一次
    每次都创建已连接的socket?
    2018-06-25
    4
  • 星文友
    select由文件描述fd_set限制
    epoll 由文件描述符数量限制
    两个差异很大吗

    作者回复: 大,文件描述符更大,fdset小的多

    2018-06-16
    4
  • fumeck.com🍋🌴summer sk...
    每天上班路上阅读,很充实,对于菜鸟的我收益颇多
    2018-06-15
    4
  • 传说中的成大大
    这篇文章,最突出的一点就是竟然把linux的epoll讲解的这么简单明了,windows下是用iocp完成端口!
    2019-03-06
    3
  • Observer
    还的继续啃 Unix 网络编程

    作者回复: 对的,这是好书

    2019-02-13
    3
  • 扬~
    UDP的socket的调用过程中,为什么没有listen呢,要不应用程序怎么监听此端口?要不怎么把UDP的包发往监听此端口的应用程序呢?基于UDP的方式会不会因为连接数过多,造成服务器处理压力增大从而延迟增高呢?因为他们共用一个端口,而不是像TCP那样会复制一个套接字随机分配一个端口用于数据接受和发送。我不知道我说的对不对,希望老师能够解答一下困惑。

    作者回复: udp没有状态,所以不存在监听这个状态,内存里没有保存连接的任何信息,不占用资源,所以不存在连接数过多的压力,顶多是把网卡打满

    2018-11-02
    3
  • 赵强强
    老师,sk_buffer里面的数据应该是剔除掉链路层和网络层头部信息的吧?

    作者回复: 没有,内核代码就是这样的

    2018-06-15
    3
收起评论
82
返回
顶部