TCP协议
TCP协议的头部为20Byte
TCP头部的数据格式
-
端口号:各占 2 个字节,端口号与IP首部中的源端IP地址和目的端IIP地址唯一确定一个TCP连接。
-
序号:占 4 字节,整个要传送的字节流的起始序号必须在连接建立时设置
-
确认号:占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号,所以确认序号=上次成功接受的序号+1
-
数据偏移:占 4 bit,最高可表达15,单位为4byte,它指出 TCP 报文段的数据部分起始处距离 TCP 报文段的起始处有多远,实际就是指出TCP首部长度(考虑选项部分)。
-
保留:占6bit,至今未用,为0.
-
控制位:表明本报文段的性质
- URG:紧急
- ACK:确认
- PSH:推送
- RST:复位
- SYN:同步
- FIN:终止
-
窗口:占2个字节,窗口大小表示接收方允许发送方发送报文段的多少,以字节为单位,在数据传输过程中是动态变化的,因为接收方的数据缓存空间是有限的。
-
检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分
-
紧急指针: 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据,因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
-
选项 : 长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。选项包含最大报文段长度(MSS)、窗口扩大、时间戳、选择确认等。
- 最大报文段长度MSS:指的是报文段中数据字段的最大长度,不包含首部长度。默认值为536字节,为了提高网络利用率,MSS要尽可能大一些,只要在IP层传输时不需要再分片就行。
- 窗口扩大选项:
- 时间戳:
- 选择确认:
TCP的连接、数据传输、关闭状态
连接过程
关闭过程
TCP的状态机
常见面试问题收集
1:TCP协议为什么需要三次握手?而不是两次?或四次?
- TCP协议为什么需要四次挥手?为什么不能是三次?
- TCP三次握手双方都交换了哪些东西?
- 既然IP层会分片,为什么还需要在TCP层用MSS来限制大小?
- TCP四次挥手时,为什么time_wait等待时间是2MSL?如果系统产生大量的timewait怎么办?
- listen时backlog参数的用处?
- 服务端调用accept函数是不是标识着TCP 建连成功?
- 什么是SYN攻击?
- TCP的RTT和RTO是怎么计算的?
- TCP除了超时重传还有哪些重传机制?
- 拥塞控制和流量控制到底是什么区别?
- 什么叫零窗口?
- TCP keepalive?
- 一条TCP连接的开销?
- TCP常见的网络传输优化手段有哪些?