用户数据报协议,即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作只产生一个UDP数据报,从而发送一个IP数据报。进程通过创建一个Internet域内的SOCK_DGRAM类型的插口,来访问UDP。该类插口默认地称为无连接的(unconnected)。每次进程发送数据报时,必须指定目的IP地址和端口号。每次从插口上接收数据报时,进程可以从数据报中收到源IP地址和端口号。
UDP的首部结构如下所示:
u_short uh_sport; /* source port */
u_short uh_dport; /* destination port */
short uh_ulen; /* udp length */
u_short uh_sum; /* udp checksum */
};
uh_sport为源端口号,标识发送进程。
uh_dport为目的端口号,标识接收进程。
uh_ulen 为UDP的长度,包括UDP首部和UDP数据的字节长度。
uh_sum 为UDP校验和,UDP检验和覆盖UDP首部和UDP数据。
UDP输出很简单:IP和UDP首部放在用户数据的前面,尽可能填满首部,把结果传递给ip_output。唯一复杂的是UDP检验和计算,包括只为计算UDP检验和而加上一个伪首部。
当udp_input收到一个数据报时,它首先完成一个常规确认(长度和检验和);然后的处理根据目的IP地址是单播地址、广播或多播地址而不同。最多把单播数据报提交给一个进程,但多播或广播数据报可能会被提交给多个进程。
TCP首部结构如下所示:
u_short th_sport; /* source port */
u_short th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
#if BYTE_ORDER == LITTLE_ENDIAN
u_char th_x2:4, /* (unused) */
th_off:4; /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char th_off:4, /* data offset */
th_x2:4; /* (unused) */
#endif
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
};
TCP首部中4bit的首部长度、接着的6bit的保留字段和6bit的码元标志,在C结构中定义为两个4bit的比特字段,和紧跟的一个8bit字节。为了处理两个比特字段在8bit字节中的存放次序,C代码根据不同的主机字节存储顺序使用了#ifdef语句。
TCP中称4bit的th_off为“首部长度”,而C代码中称之为“数据偏移量”。两种名称都正确,因为它表示TCP首部的长度,包括可选项,以32bit为单位,也就是指向用户数据第一个字节的偏移量。
每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。
确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。
首部长度给出首部中32bit字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占4bit,因此TCP最多有60字节的首部。
在TCP首部中有6个标志比特。它们中的多个可同时被设置为1。
URG紧急指针(urgentpointer)有效。
ACK确认序号有效。
PSH接收方应该尽快将这个报文段交给应用层。
RST重建连接。
SYN同步序号用来发起一个连接。
FIN发端完成发送任务。
TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16bit字段,因而窗口大小最大为65535字节。
校验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。TCP校验和的计算和UDP校验和的计算相似。
紧急数据偏移量是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。