20230410开始网络编程

108 阅读4分钟

缘起

  • 这是《TCPIP网络编程》的Part01的复习版吧,主要框架来自于这本书,我只是列了下自己自己懂了和没懂的地方,算是个复习笔记吧。
  • 2023-04-10也算push我自己复习一遍,看看还有哪没有真搞懂的,2023-04-11的时候再check一遍,同时完善一下摘要笔记。

内容

chap1、理解网络编程和套接字

  • TCP client:socket()、connect()、read()/write()、close()

  • TCP server:socket()、bind()、listen()、accept()、read()/write()、close()

  • tcp客户端和服务器区别_深入理解TCP 服务器与客户端,这里有三次握手、四次挥手

  • 自己想到的问题:

    • 1、client和server怎么区分?TCP中首先发送SYN报文的一方是client,那么UDP中存在发SYN报文嘛,不存在的,lionel

chap2、套接字类型与协议设置

  • int socket(int domain, int type, int protocol);的三个参数详解

  • type至少有以下2种类型

    • 流socket:面向连接
    • 数据报socket:面向消息

chap3、地址族与数据序列

  • IP+Port

  • 字节序

    • 大端:高位字节存在高位地址,网络字节序就是大端
    • 小端:高位字节存在高位地址
  • 字节序转换

    • 主机字节序与网络字节序转换
  • lionel,这一节,我并没有完全消化好

chap4-5、基于TCP的服务端/客户端

  • 1、基于TCP的代码
  • 2、迭代服务器的代码
  • 3、echo服务器的代码

chap6、基于UDP的服务端/客户端

  • UDP就是根据端口号将传到主机的数据包交付给最终的UDP套接字

  • sendto()的3个阶段:

    • 1、向UDP套接字注册目标IP和端口号 使用connect()只是把这一步给省了【lionel】
    • 2、传输数据
    • 3、删除UDP套接字中注册的目标地址信息
  • 创建已连接UDP套接字

  • UDP的差异,还需要再了解一下,lionel

    • 1、UDP有没有边界
    • 2、1个UDP的socket是不是就能和网络上的任何机器连接?

chap7、优雅的断开套接字连接

  • 一般定义的断开close() 是指传输数据、接收数据都关闭
  • shutdown()就只关注其中一个,即,流的一半

chap8、域名及网络地址

  • 域名比IP地址更稳定,不用每次修改代码
  • gethostbyaddr()、 gethostbyname()

chap9、套接字的多种可选项

  • getsockopt()、setsockopt()
  • SO_REUSEADDR 【重点是time_wait的状态】,要搜一下TCP-IP状态转换图
  • TCP_NODELAY 【理解清楚 Nagle算法
  • lionel,time_wait找了些资料看了下,还是有点蒙的

chap10、多进程服务器端

  • 调用fork()
  • 信号处理(wait,waitpid,signal,sigaction
  • 分割I/O没完全看懂它

chap11、进程间通信

  • 管道
  • lionel,未看

chap12、I/O复用

  • 原理和select()

chap13、多种I/O函数

chap14、多播与广播

  • 两者都基于UDP,区别在于

    • 多播:要加入多播组,哪怕跨网络

    • 广播:只能向同一网络中的主机

      • 直接广播(Directed):除网络地址外,其余主机地址全部设置为1.
      • 本地广播(local):255.255.255.255
  • 这个没太懂

最后

参考

收获

  • 1、04-10及之前几天有意识的画了些图三次握手、四次挥手,TIME_WAIT,当然粘包的问题后面再去学。

  • 2、UDP的connect()其实不是必须的,我之前还以为需要呢

  • 3、复习完这个

    • 再看part02
    • 再看《编程手册》56-61(这个就很简单了),61章的高级有点深度,其它的,要push自己好好看
    • 再看下《Linux高性能服务器编程》的部分章节
    • 《unix网络编程》看不看得再说吧
    • 主要是push自己,把这部分真正的掌握,要不要学人家画思维导图,还没有想好