TCP-简介
TCP位于OSI的第四层(传输层)
特点
-
面向连接
- 需要建立连接才能传输,每一条TCP连接是点对点的,都有两个端点
- 这个端点叫做套接字(socket)
- 本质是文件描述符,绑定了
IP地址 + 端口号 - 两端加起来就是一个四元组
- 本质是文件描述符,绑定了
-
传输可靠
- 消息报文附带校验码,出现错误或丢包时会触发自动重传
-
全双工通信
- 设有发送缓存和接收缓存,双方可以同时发送和接收数据
-
面向字节流
- 消息报文可能会被拆分成多个部分,无消息边界,每一部分进行时序编号,按字节流进行发送,所以可能会出现粘包问题
-
流量控制
- 为了让发送方发送数据的速度不要太快,让接收方来得及接收
- 通过大小可变的滑动窗口实现,假如A要发给B
- 建立连接时,B会告知A,接收窗口大小 rwnd = 400(字节)
- A发满这个数,就会停止,直到B新的ACK到达,指示后面可以继续发多少rwnd
- 【死锁问题】B向A发送了rwnd为0的报文,A停止发送,然后B后面有空间了,就发了一个rwnd为400的报文,但这个报文丢失了,A一直在等着可以发,B也一直在等后面的数据,造成死锁
- 解决办法:发送方A在收到rwnd为0报文后,设置一个持续计时器,到期后会主动发送探测报文,若返回不是0,那就可以打破死锁
-
拥塞控制
-
慢开始
- 开始发送时,设置拥塞窗口cwnd = 1
- 先使用慢开始算法,少量测试网络拥塞程度,逐步增加cwnd大小
- 设置一个慢开始门限 ssthresh,cwnd超过这个门限,才会把慢开始算法替换成拥塞避免算法
-
拥塞避免,有效降低丢包率
- 每经过一个返回时间RTT,就把 cwnd 加一
- 当网络出现拥塞,就把ssthresh设置成cwnd的一半,然后把 cwnd设置为1,重启慢开始过程
-
快恢复
- 当发送方连续收到3个重复确认,证明网络可能没有拥塞,就把ssthresh自身减半,然后 cwnd 设置为 新ssthresh 的大小,继续执行拥塞避免算法,快速恢复
-

- 首部开销明显
- 最小20字节,最大60字节