《TCP/IP详解,卷2:实现》读书笔记-UDP和TCP的首部

 用户数据报协议,即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作只产生一个UDP数据报,从而发送一个IP数据报。进程通过创建一个Internet域内的SOCK_DGRAM类型的插口,来访问UDP。该类插口默认地称为无连接的(unconnected)。每次进程发送数据报时,必须指定目的IP地址和端口号。每次从插口上接收数据报时,进程可以从数据报中收到源IP地址和端口号。
UDP的首部结构如下所示:

struct udphdr { 
        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输出很简单:IPUDP首部放在用户数据的前面,尽可能填满首部,把结果传递给ip_output。唯一复杂的是UDP检验和计算,包括只为计算UDP检验和而加上一个伪首部。
udp_input收到一个数据报时,它首先完成一个常规确认(长度和检验和);然后的处理根据目的IP地址是单播地址、广播或多播地址而不同。最多把单播数据报提交给一个进程,但多播或广播数据报可能会被提交给多个进程。


TCP首部结构如下所示:
struct tcphdr { 
        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中称4bitth_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的紧急方式是发送端向另一端发送紧急数据的一种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值