拜读UNP前两部分

前言

利用国庆黄金周的假期,粗略地看了UNIX网络编程这边关于网络编程的经典书籍。主要当做是复习了一下计算机网络的知识,还有了解了一些基本的套接字编程,包含TCP、UDP和SCTP三种不同的传输层协议。在这里写一篇总结,当做是知识的整理。

第一部分:简介和TCP/IP

第一章: 简介

  1. 大三下学期学过计算机网络这么课,当时学的糊里糊涂,只了解到计算机网络是分层的,然后每层里面都有各种复杂的协议。但是脑海当中还是感觉非常的抽象,无法想象计算机网络是怎样协同工作的。
  2. UNP 的第一章主要介绍了计算机网络的发展以及分层思想,提供了一个简单的时间获取客户和服务程序,以及不同实现的系统对网络的支持。
  3. 两个程序均对有可能发生出错的地方进行了处理,比如输入的参数个数不够, socket 或者 connect 函数执行失败等等。套接字描述符类似于文件描述符,而描述符其实可以理解为操作系统对某个资源的一个标识,就是所谓的句柄。这个标识是独一无二的,根据该标识就可以找到操作系统为该操作保留的各种资源。
  4. UNP 这本书的一个特色是将所有需要用到的头文件还有自定义的资源都包含在一个 unp.h 的头文件里面,需要进行检查是否错误的函数的用大写字母开头的包裹函数封装起来,以简化代码,比如 socket、read、write等函数。

第二章:传输层:TCP、UDP和SCTP

  • 三种不同的传输层协议是用户程序直接接触的一层协议,SCTP流传输控制协议是较新的。
  • TCP 是可靠的面向连接的全双工协议,三路握手连接,四分组交换序列终止连接。 TCP 状态转换图可以清楚描述每个状态之间的转换。TCP 的 TIME_WAIT 状态十分重要,为了处理最后一个 ACK 确认分组的丢失情况和允许老的重复分节从网络中消逝。主动关闭端的 TIME_WAIT 状态持续2倍的MSL(最长分节生命期)。
  • SCTP 是四路握手连接,三路交换序列连接。没有半关联状态,连接时可以捎带数据。使用了标记,所以没有 TIME_WAIT 状态。
  • TCP 并发编程的关键是服务器端新开子进程或者子线程来处理新的连接。
    拜读UNP前两部分
    拜读UNP前两部分

第二部分 基本套接字编程

第三章 套接字编程简介

  1. 套接字地址结构,其实就是各种系统为了支持网络而设定的结构体。一般会包含地址和端口等信息,作为参数传递时一般会另外传递一个长度参数。
  2. 网络传输和系统可能使用不同的字节存储方式,大小端字节序。可以用一个联合体(union关键字)测试使用的是那种字节序。低序字节放在起始地址是小端字节序
  3. 点分十进制和纯数字表达的 IP 地址可以通过 inet_pton、inet_ntop等进行转换。
  4. 文本行交互的操作应该按照缓冲区来编写。例如 write、 read等函数。

第四章 基本TCP套接字编程

  • 客户和服务端都使用socket函数,客户connect,服务器则调用bind、listen、accept函数。
  • TCP服务器一般都是并发的,用fork生成子进程进行处理。
    拜读UNP前两部分

第五章 TCP客户 服务器程序示例

  • 服务器连接子进程正常终止后进入僵死状态,用 waitpid 函数尽行清理。waitpid函数包含在信号处理函数当中。
  • 实际情形中还会遇到客户程序被阻塞在等待用户输入中而无法知道服务程序已终止的情况,或者服务器主机奔溃客户端要发送数据之后才能知道。可以用select即IO复用技术进行解决。
  • 发送二进制数据要考虑字节序的问题。

第六章 IO复用

  • select实现IO复用,可以设置最长等待时间和最大描述符号等等。
  • shutdown函数可以进行半关闭的操作,让缓冲区的内容发送完毕。
    拜读UNP前两部分

第七章 套接字选项

这个章节主要介绍通过getsockopt和setsockopt函数进行套接字选项的设置,内容繁多,可做字典查询。重要的选项比如SO_KEEPALIVE、SO_RCVBUF等等。

第八章 基本UDP套接字编程

  • UDP无连接、不可靠、直接发送数据。通过从接收的套接字描述符验证发送者的信息。需要应用层进行一些检测,如检验重传等等。* DNS使用的是UDP协议*
  • UDP也可以使用connect函数连接,连接之后可以接受异步错误。
  • UDP没有流量控制,当客户端和服务端的发送接收速度不一样的时候很容易丢包,丢包率很高。
    拜读UNP前两部分

第九章 基本SCTP套接字编程

  • SCTP的一对一连接跟TCP兼容,连接方式一致。SCTP是多宿的,可以一对多连接,一对多主要的特点在于消息可以发送到流上,而流号的不同标识了不同的数据块。
    拜读UNP前两部分
    拜读UNP前两部分

第十章 SCTP客户服务器程序例子

这个例子采用一对多的方式,运用迭代方式构造,实现多流特性。该特性可以用于解决头端阻塞问题。* 比如发送三张图片,图一TCP分节丢失会使后续发送延迟。但是可以将三个图片分SCTP的三个流进行发送,图一的分节丢失并不影响其他流。*

第十一章 名字与地址转换

  • 为了解决地址的表示问题,通过域名系统。
  • getaddrinfo和getnameinfo等函数是协议无关的。

总结

啰里啰嗦记录了一些知识点,回顾了之前看过的内容,接下来是找机会时间一下,比如写一个http服务器。