- TCP协议更接近应用层
3.1 TCP服务的特点
- 传输层协议有两: TCP和UDP
- TCP协议面向连接, 字节流, 可靠传输
- TCP和UDP发送接收的区别
- TCP传输的可靠性
- TCP协议采用发送应答机制,也就是发送的每一个TCP报文得接收到对方的应答, 才认为是传输成功.
- 超时重传, 如果在给定时间内未收到应答, 认为传送失败, 会再次传输.
- 重排和整理, 由于IP数据报是不可靠的, 接收端有可能会乱序, 所以TCP协议还负责报文的重排.
3.2 TCP的头部结构
3.2.1 TCP固定头部结构
3.2.2 TCP头部选项
- 选项是可变长度的,
- 略
3.2.3 使用tcpdump观察TCP头部信息
略
3.3 TCP连接的建立和关闭
3.3.1 使用tcpdump观察tcp连接的建立和关闭
tcp连接的三次握手和四次挥手
3.3.2 半关闭状态
- 客户端告诉服务器这边数据传输结束, 需要关闭了, 但是服务器还有一些数据没有传输完, 客户端还能继续接收服务器的数据, 知道服务器数据传输完毕, 发送结束报文, 这种连接状态就是半关闭.
- 如下图, 客户端发起关闭连接之后, 服务器还能继续传输数据, 直到同样发送一个fin 结束报文.
虽然有半关闭, 但用的少
3.3.3 连接超时
- 如果由于服务器对于客户端发送的报文没有即时应答, 那么对于TCP而言, 他会先进行重连, 执行多次, 如果仍然无效, 那么通知应用程序连接超时.
3.4 TCP状态转移
3.4.1 TCP状态转移图
3.4.2 TIME_WAIT状态
- 客户端在收到服务器的接收报文(FIN, ACK)之后, 没有直接关闭, 而是进入TIME_WAIT状态, 一段时间之后再关闭
- 因为他客户端并不确定服务器是否有接收到报文7, 假如没有, 那过一段时间服务器就会重发报文6, 这样客户端就知道服务器刚刚没收到7, 就会重发7.
- TIME_WAIT状态可以保证可靠的终止TCP连接.
- 这段时间通常是2min
- 所以如果应用程序重启, 之前的端口出于TIME_WAIT状态, 是没法立刻被使用的.
3.5 复位报文段
- TCP报文, 携带RST标志
3.5.1 访问不存在的段门口
- Flags[R], 告诉发送方你请求的端口是不存在的, 不要再发了, 接收到复位报文段的主机应该关闭或者重新连接, 而
不能回应
这个报文.
3.5.2 异常终止连接
- 需要异常终止连接的时候, 也就是强制结束, 就立刻给对方发一个复位报文端
- 这样发送端的所有等待发送的数据都会被丢弃.
3.5.3 处理半打开连接
- 半打开: 一端有连接信息, 另一端因为各种问题(异常关闭重启等)没有连接信息, 这种就叫半打开
- 如果客户端向版打开的连接写入数据, 另一方会回应一个复位报文段
3.6 TCP交互数据流
- TCP连接交换的应用程序数据: 交互数据(时效性高, 数据量少), 成块数据(传输效率高, 也就是单次数据量高)
- 延迟确认: 服务器在发送确认报文的时候, 包括需要发送的应用程序信息, 而客户端发送的确认报文不包括应用程序信息.
- 延时确认能够减少需要发送的TCP报文的数量.
3.7 TCP成块数据流
- 当使用FTP协议传输大文件时候, 发送方会连续发送多个TCP报文端, 接收方一次确认所有这些报文段
- 连续发送的报文段的数量, 由接收通告窗口的大小决定
3.8 带外数据
- 优先级高
- TCP并没有真正实现带外数据, 是利用其头部的URG标志
3.9 TCP超时重传
略
3.10 拥塞控制
3.10.1 拥塞控制概述
- 拥塞控制四部分: 慢启动, 拥塞避免, 快速重传, 快速恢复
- CWND(Congestion window) 拥塞窗口
略