TCP在计算检验和时,要加上一个12字节的伪首部。
伪首部(pseudo header),通常有TCP伪首部和UDP伪首部。
伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,既不向下传送也不向上递交,而仅仅是为计算校验和,
既校验了TCP&UDP用户数据的源端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。
伪报头保证TCP&UDP数据单元到达正确的目的地址。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。
伪首部共有12字节
第一行:Source IP address 32bit
第二行:Destination IP addr 32bit
第三行:8位保留字节 + protocol + header length
8位保留字节,全部设置为0
protocol,协议号,8bit,tcp 6,UDP17
header length,报文长度(首部+数据),16bit
检验和计算过程(以TCP校验为例)
TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部。
发送端:
首先,把伪首部、TCP报头、TCP数据分为16位的 字 ,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。
把TCP报头中的校验和 字 段置为0。
其次,用反码相加法(对每16bit进行二进制反码求和)累加所有的16位字(进位也要累加,进位则将高位叠加到低位)。
最后,将上述结果作为TCP的校验和,存在检验和字段中。
接收端:
同样利用反码求和,高位叠加到低位, 如计算结果的16位中每一位都为1,则正确,否则说明发生错误。
验证示例:
校验和 反码求和过程
以4bit 为例
发送端计算:
数据: 1000 0100 校验和 0000
则反码:0111 1011 1111
叠加: 0111+1011+1111 = 0010 0001 高于4bit的, 叠加到低4位 0001 + 0010 = 0011 即为校验和
接收端计算:
数据: 1000 0100 检验和 0011
反码: 0111 1011 1100
叠加: 0111 + 1011 +1100 = 0001 1110 叠加为4bit为1111. 全为1,则正确
int socket(int domain, int type, int protocol);
在参数表中,domain指定使用何种的地址类型,比较常用的有:
PF_INET6, AF_INET6: Ipv6网络协议。
type参数的作用是设置通信的协议类型,可能的取值如下所示:
SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
OOB: 在所有数据传送前必须使用connect()来建立连接状态。
SOCK_DGRAM: 使用不连续不可靠的数据包连接。
SOCK_SEQPACKET: 提供连续可靠的数据包连接。
SOCK_RAW: 提供原始网络协议存取。
SOCK_RDM: 提供可靠的数据包连接。
SOCK_PACKET: 与网络驱动程序直接通信。
参数protocol用来指定socket所使用的传输协议编号。这一参数通常不具体设置,一般设置为0即可。