后端开发核心技术 第6章tcp 头部
头部详解
16位端口号(port number)
告知主机报文源端口和目的端口,在tcp通信中,客户端通常使用系统自动选择的临时端口号,而服务器使用知名服务端口号。
32位序号(sequence number)
表示一次tcp通信过程(从建立连接到断开)过程中某一次传输方向上的字节流的每个字节的编号。假定主机A和B进行tcp通信,A传送给B一个tcp报文段中,序号值被系统初始化为某一个随机值ISN,那么在该传输方向上(从A到B),后续的所有tcp报文断中的序号值都会被设定为ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。
32位确认号(acknowledgement number)
用作对另一方发送的tcp报文段的响应。其值是收到对方的tcp报文段的序号值+1。假定主机A和B进行tcp通信,那么A发出的tcp报文段不但带有自己的序号,也包含了对B发送来的tcp报文段的确认号。反之也一样。
4位头部长度(header length)
表示tcp头部有多少个32bit字(4字节),因为4位最大值是15,所以最多有15个32bit,也就是60个字节是最大的tcp头部长度。
6位标志位
URG:紧急指针是否有效
ACK:表示确认好是否有效,携带ack标志的报文段也称确认报文段
PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为后续接收的数据让出空间
RST:表示要求对方重建连接。带RST标志的tcp报文段也叫复位报文段
SYN:表示建立一个连接,携带SYN的tcp报文段为同步报文段
FIN标志:表示告知对方本端要关闭连接了。
16为窗口大小(window size)
是TCP流量控制的一个手段,这里说的窗口是指接收通告窗口,它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
16为校验和(TCP checksum)
由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。
16位紧急指针(urgent pointer)
是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。不妨称之为紧急便宜,发送紧急数据时会用到这个。
TCP头部选项
最后一个选项字段是可变长的可选信息,最多包含40字节的数据
注意点
TCP包没有IP地址
TCP包没有IP地址,那是IP层的事情,只有源端口和目的端口
Tcp链接需要4个元组
Tcp链接需要4个元组(src_ip,src_port,dst_ip,dst_port)来表示是同一个链接,准确的说是五元组,还有一个协议
Sequence Number
是包的序号,用来解决网络包乱序的问题
Acknowledgement number
就是ACK,用于确认收到,用来解决不丢包的问题
Window
滑动窗口,用来解决流控问题
TCP Flag
包的类型,用来操作TCP的状态机