UNIX网络编程第二章
第2章. 传输层:TCP、UDP和SCTP
TCP/IP协议总图——
IPv4——网际协议版本4, 32位
IPv6——网际协议版本6, 128位
TCP——传输控制协议
UDP——用户数据报协议
SCTP——流控制传输协议
1. UDP
UDP是一个无连接协议(客户与服务器不必存在任何长期的关系),UDP数据报不能保证它们的目的地。不可靠。
UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
2. TCP
TCP是面向连接的协议,为用户提供可靠的全双工字节流,关心确认、超时和重传之类的细节。
1) 过程
建立连接——>传输数据——>终止连接
2) 确认数据
TCP要求对端返回一个确认,如果没有收到确认,TCP就自动重传数据并等待更长时间,数次失败后才放弃。
3) RTT估算
动态估算客户与服务器之间的往返时间
4) 数据编号
TCP通过对其中每一个字节关联一个序列号对所发送的数据进行排序。
5) 流量控制
TCP会告知对端在任何时刻它一次能够从对端接收多少字节的数据,称为通告窗口,而且是时刻变动的(接收数据时,窗口变小,读走数据时,窗口变大)。
6) 全双工
即发怂,又接收
3. SCTP
SCTP提供客户与服务器之间的关联,提供可靠性、排序、流量控制以及全双工的数据传送。
关联与连接含义不同,关联指代两个系统之间的一次通信,可能因为SCTP支持多宿而涉及不止两个地址。
SCTP面向消息,提供各个记录的按序递送服务,由发送端写入的每条记录的长度随数据一道传递给接收端应用。
SCTP提供端点之间多个流,每个流各自可靠的按序递送消息,一个流上的消息丢失不会阻塞其他流。(TCP不同,任何一个丢失,都要等其修复才能继续递送消息)。
4. TCP连接的建立与终止
4.1 三次握手
1)服务器必须准备好接受外来的连接。函数:socket, bind, listen,被动打开;
2)客户通过调用connect发起主动打开。TCP发送一个SYN(同步)分节,告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。
通常SYN分节不携带数据,其所在IP数据报只有一个IP首部、一个TCP首部即可能有的TCP选项。
3)服务器必须确认(ACK)客户的SYN,同时自己也发送一个SYN分节,它含有服务器将在同一连接中发送的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。
4)客户确认服务器的SYN 。
SYN的ACK中的确认号为该SYN的初始序列号加1.
4.2 TCP选项
1) MSS选项 —— 最大分节大小
2) 窗口规模选项
3) 时间戳选项
4.3 TCP终止连接(四次挥手)
1) 某个应用进程首先调用close,主动关闭。TCP发送一个FIN分节,表示数据发送完毕;
2) 接收到这个FIN的对端执行被动关闭。这个FIN由TCP确认。注意FIN的接收应该在等候该应用进程接收的任何数据之后,即FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3) 一段时间后接收这个文件结束符的应用进程将调用close关闭套接字,TCP为它也发送一个FIN。
4) 接收这个最终FIN的原发送端TCP确认这个FIN。
FIN的ACK确认号就是这个FIN的序列号加1.
4.4 TCP状态转换图
4.5 分组观察
服务器对客户请求的确认是伴随其应答发送的,这种做法为捎带,通常在服务器处理请求并产生应答的时间少于200ms时发生。如果服务器耗时时间更长,那么将先发送确认,再发送应答。
4.6 TIME_WAIT状态
作用:
1) 可靠的实现TCP全双工连接的终止;
2) 允许老的重复分节在网络中消逝。
TIME_WAIT的时间为MSL的两倍。
5. SCTP关联的建立和终止
5.1 建立关联,思路握手
1)服务器必须准备好接受外来的关联。socket, bind和listen,被动打开。
2)客户通过调用connect或者发送一个隐式打开该关联的消息进行主动打开。这使得客户SCTP发送一个INIT消息(初始化),告诉服务器客户的IP地址清单、初始序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目。
3)服务器以一个INIT ACK消息确认客户的INIT消息。包含服务器的IP地址清单、初始序列号、起始标识、服务器请求的外出流数目、服务器能够支持的外来流的数目以及一个状态cookie。cookie包含服务器用于确信本关联有效所需的所有状态。
4)客户以一个COOKIE ECHO消息回射服务器的状态cookie。
5)服务器以一个COOKIE ACK消息确认客户回射的cookie是正确的,关联建立。
四路握手是为了避免拒绝服务攻击。
5.2 关联终止 三路握手
5.3 状态转换
5.4 分组观察
5.5 SCTP选项
1) 动态地址扩展
2)不完全可靠性扩展
6. 端口号
TCP、UDP、SCTP使用16位整数端口号区分不同进程。
套接字对:
一个定义连接的两个端点的四元组:本地IP地址,本地TCP端口号,外地IP地址,外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接。
7. TCP端口号与并发服务器
并发服务器中主服务器循环通过派生一个子进程来处理每个新连接。