Unix网络编程读书笔记(一)

之前终于把unix环境高级编程这本书过了一遍,其中介绍的内容不少,有些内容一下子还接受不了。算了,就先这样吧,以后用到的时候再详细研究吧。

今天开始看看Unix网络编程这本书。还是在看书的同时写写读书笔记,方便忘记了随时查阅。

先来看看TCP与UDP之间的区别,一个老掉牙的问题了。

  1. TCP是面向连接的,UDP是无连接的。
  2. TCP是可靠的而UDP是不可靠的。为了实现这一区别,TCP采用了“发送数据确认”、“发送数据编号”、“超时重传”、“RTT估算(这一机制与超时重传配合使用)”、“接收数据重排”、“重复数据丢弃”等机制,保证TCP的可靠性。
  3. TCP提供拥塞控制与流量控制。UDP不具备。
  4. TCP是一种流模式协议,UDP是一种数据报模式协议。

在这里也给大家分享一篇有关TCP的blog:

http://coolshell.cn/articles/11564.html

http://coolshell.cn/articles/11609.html

三路握手

  1. 服务器必须准备好接受外来的连接。这通常通过调用socket、bind和listen这三个函数完成,这一过程被称为被动打开(passive open)。
  2. 客户通过调用connect发起主动打开(active open)。这导致客户TCP发送一个SYN(同步)分节。它告诉服务器客户将在(待建立的)连接中发送的数据的初始序号。通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部、一个TCP首部及可能有的TCP选项。此时TCP首部中的SYN字段为1,ACK字段为0,代表TCP头部中有“序号”,但没有“确认序号”。
  3. 服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。此时TCP首部中的SYN、ACK字段均为1,代表TCP头部中同时具有“序号”与“确认序号”,ACK序号为SYN序号加1。
  4. 客户必须确认服务器的SYN。此时TCP首部中的ACK字段为1,SYN为0,代表TCP头部中仅有“确认序号”,不具备“序号”,ACK序号为SYN序号加1。

直接借用书中的配图

Unix网络编程读书笔记(一)_第1张图片


连接终止

建立一个连接需要三次握手,而终止一个连接需要4次握手。这是由TCP的半关闭造成的。由于TCP连接是全双工的,因此每个方向必须单独的进行关闭。

  1. 某个应用进程首先调用close,则该端被称为主动关闭(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。此时TCP首部中的FIN字段为1,ACK字段也为1,代表此时TCP头部中同时具有“序号”、“确认序号”。
  2. 接收到这个FIN的对端执行被动关闭(passiv close)。这个FIN由TCP确认。它的接收也作为一个文件描述符传递给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。此时TCP首部中的ACK字段为1,代表此时TCP头部中仅有“确认序号”,ACK序号为SYN序号加1。
  3. 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送FIN。此时TCP首部中的SYN、ACK字段同时为1,代表此时TCP头部中同时具有“序号”、“确认序号”。
  4. 接收这个最终FIN的原发送端TCP确认这个FIN。此时TCP首部中的ACK字段为1,代表此时TCP头部中仅有“确认序号”,ACK序号为SYN序号加1。


还是直接借用书中的图

Unix网络编程读书笔记(一)_第2张图片

以下是对书中知识的一些总结:

TIME_WAIT状态有两个存在的理由:

  1. 可靠地实现TCP全双工连接的终止。
  2. 允许老的重复分节在网络中消逝。

最大报文段长度(MSS)表示TCP传往另一端的最大块数据的长度。MSS的目的是告诉对端其重组缓冲区大小的实际值,从而试图避免分片。MSS经常设置成MTU减去TCP和IP首部的固定长度。

“序号”与“确认序号”

在了解复位报文段的相关内容之前,首先要区分TCP首部中“序号”与“确认序号”的概念,在TCP首部中这两个字段均使用32位表示。其中“序号”用来标示从TCP发送端到TCP接收段发送的数据字节流,它表示在这个报文段中的第一个数据字节。当建立一个新连接时,SYN标志置1,序号字段包含由这个主机选择的该连接的初始序号(ISN)。该主机要发送数据的第一个字节序号为ISN加1,因为SYN要占据一个序号。而“确认序号”包含发送确认的一端(TCP连接的另一端)所期望收到的下一个序号。只有ACK标志为1时确认字段序号才有效。

缓冲区大小及限制

IPv4数据报的最大大小是65535字节,包括IPv4首部,首部中总长度字段占据16位。IPv6数据报的最大大小是65575字节,包括40字节的IPv6首部,首部中的长度字段代表净荷长度,这一长度不包括IPv6首部的长度。

网络上有一个可由硬件规定的MTU。当一个IP数据报将从某个接口送出时,如果它的大小超过相应链路的MTU,IPv4和IPv6都将执行分片。




你可能感兴趣的:(读书笔记)