TCP
接收方驱动
面向连接的运输层协议。在不可靠 IP 网络的基础上进行可靠传输,提供可靠交付的服务。
每一条 TCP 连接只能有两个端点,点对点的全双工通信
不支持广播、多播服务,开销较大、效率低(建立有序的东西要花费代价)
TCP 报文
网络带宽的增长永远跟不上业务的需求
网络的拥塞问题
面向字节流:虽然应用程序和 TCP 一次交互一个数据块,但交互的数据仅看作无结构的字节流(可以任意断开组合)
流:流入流出进程的字节序列
不关心应用程序一次把多长的报文发送到 TCP 缓存
根据窗口值和网络拥塞程度来决定一个报文应该包含多少字节,形成 TCP 报文
TCP 的连接
将连接作为最基本的抽象
套接字Socket = (IP 地址:端口号)
锁定互联网中特定主机的特定进程
Socket
TCP连接 ::= {socket1,socket2}={(IP1,port1),(IP2,port2)}
实际用户编程使用五元组描述
TCP连接 ::= {socket1,socket2}={(IP1,port1),(IP2,port2),protocol}
protocol 可选:UDP、TCP
TCP 报文首部
最大传输大于 4GB
序号:随机数开始到
确认号:期望收到的对方的下一个报文段的第一个数据字节的序号(可有效实现累积确认)
确认号为 N,则暗含已正确收到前N-1 个数据
假设收到 1-999,1000-1999,2000-2999
则接收方发送确认:请发送第3000 位的报文(暗含接收到之前的所有数据)
控制位
每一位都为 1bite
ACK:置为 1 表示确认号有效(一般不单独发送,和数据合并在一起,在通信中确认是否“确认有效”)
SYN:SYN为 1 时表示连接请求(ACK=0)或连接接受(ACK=1)
FIN:结束位,为 1 时,释放连接
窗口
明确允许对方发送数据的量,窗口的值保持动态变化
TCP 可靠传输实现
以字节为单位
流水线传输、滑动窗口、可靠传输
发送窗口
接受窗口
超时重传时间(TCP 最复杂的问题之一)
加权平均往返时间