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

2018-06-15 刘超
《趣谈网络协议》
课程介绍


讲述:刘超

时长:大小7.95M


前面讲完了 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 程序函数调用过程

两端创...

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

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

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

    共 5 条评论
    33
  • 起风了001
    2019-05-21
    之前有专门学过epoll, 然后就特地看了一下socket和tcp连接的关系, 所以这一章看得比较清晰明白.哈哈, 技术真的是多学就能融会贯通的, 不过本章老师说的主要是linux C编程上的, 现在我用的golang写的话, 很多细节都被隐藏了, 不需要使用epoll, 直接Listen(), 然后Accept() , 有新的连接过来的话就会返回一个Conn, 然后使用golang的goroutine就可以开启一个协程处理这个连接, 一个程序可以开100万个都没压力, 所以也就没有epoll这样的概念了.

    作者回复: golang好东西

    共 4 条评论
    18
  • caohuan
    2019-01-22
    听二遍 才懂了一点,通讯里面 确实 内容丰富、技巧很多、设计巧妙。 本篇所得: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规则构建。
    展开
    
    15
  • 自然而然
    2018-07-21
    这篇写的很棒,很见功底
    
    15
  • 灵魂胖子
    2018-06-21
    老师,那个UDP 协议的 Socket 程序函数调用过程中的客户端可以不用调用bind()吧?

    作者回复: 可以

    共 2 条评论
    13
  • 大光头
    2018-06-15
    windows上有一个叫iocp,但是它还是有点不一样,它是proactor,而epoll是reactor。我觉得iocp效率会更高,epoll通知应用去读取数据,处理完之后还要返回内核发送数据,而完成端口直接在内核态进行处理数据,最后告诉应用,数据已经处理完了。
    
    11
  • Observer
    2019-02-13
    还的继续啃 Unix 网络编程

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

    
    10
  • Sam_Deep_Thinking
    2018-06-15
    真心写的好。多谢作者。
    
    10
  • 小可爱
    2019-08-10
    我有个问题就是,数据来了之后服务端怎么知道这个数据是属于哪个socket呢?

    作者回复: 端口

    共 2 条评论
    8
  • fumeck.com🍋🌴s...
    2018-06-15
    每天上班路上阅读,很充实,对于菜鸟的我收益颇多
    
    8
  • Shopee内推码:NTAGx...
    2019-07-10
    你好,服务端监听socket和连接socket并不是同一个socket,那是同一个端口么,如果是的话,怎么区分收到的数据是哪个socket的

    作者回复: 端口是一个端口。这两个socket都属于同一个进程的。内核可以区分用哪个socket接收。代码里面区分就是。就像如果你自己写代码,你就可以让socket i接收而不是socket j。

    共 2 条评论
    7
  • 传说中的成大大
    2019-03-06
    这篇文章,最突出的一点就是竟然把linux的epoll讲解的这么简单明了,windows下是用iocp完成端口!
    
    7
  • 灰灰
    2018-06-19
    老师,对socket这块一直理解比较抽象,什么情况下需要socket编程,我印象中从来没写过。盼复

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

    
    7
  • 星文友
    2018-06-16
    select由文件描述fd_set限制 epoll 由文件描述符数量限制 两个差异很大吗

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

    
    7
  • 咖啡猫口里的咖啡猫�...
    2019-02-26
    看完tcp/ip三卷 结合linux操作,再看一遍文章,刚觉老师 linux内核功力深厚。感觉书第二卷实现跟现在内核版本有些😂区别
    
    5
  • 汪木木
    2018-07-20
    这就是几种网络io的由来,bio,nio1,nio2。
    
    5