TCP异常情况
1.进程终止: 进程终止会释放文件描述符, 仍然可以发送FIN. 和正常关闭没有什么区别
进程的结束,也会导致四次挥手的进行~~
2.机器重启: 和进程终止的情况相同.(按照正确的流程重启)
此时系统就会先杀死进程,也就会触发四次挥手~~
但是随着进程的杀死,系统也就会关闭,此时四次挥手就可能出现还没挥完的情况
3.机器掉电/网线断开: 接收端认为连接还在, 一旦接收端有写入操作, 接收端发现连接已经不在了, 就会进行reset. 即使没有写入操作, TCP自己也内置了一个保活定时器, 会定期询问对方是否还在. 如果对方不在, 也会把连接释放.
两种情况:
1). 如果主机B是发送方~~ 主机B只要一发送数据,就会发现对方没有ACK(没有回应)~~ , 进一步的触发超时重传,进行一系列的重试,达到一定次数,就会重置连接~~(使用复位报文段) 也就是RST(6个标志位之一) ,重置操作任然没有回应,就会释放连接~~
2).如果主机B是接收方~~本来就要等主机A发送消息,但是主机A此时已经悄悄的下线了,所以就会浪费一定资源,但是在TCP协议中内置了"保活机制",此时主机B每隔一段时间就会给主机A发送一个很小的报文(PING),期待对方返回一个回应(PONG),尝试一定次数后,主机A任然没有回应,也会释放连接。
TCP总结
为什么TCP这么复杂? 因为要保证可靠性, 同时又尽可能的提高性能
可靠性:
- 校验和
- 序列号
- 确认应答
- 超时重传
- 连接管理
- 流量控制
- 拥塞控制
提高性能:
其他:
- 定时器(超时重传定时器,保活定时器,TIME_WAIT定时器等)
- 面向字节流
- 异常情况
基于TCP应用层协议
- HTTP
- HTTPS
- SSH
- FTP
- SMTP
- Telnet
拓展:
TCP和UDP的区别:
TCP | UDP |
---|
有连接 | 无连接 |
可靠 | 不可靠 |
面向字节流 | 面向数据报 |
我们说了TCP是可靠连接, 那么是不是TCP一定就优于UDP呢? TCP和UDP之间的优点和缺点, 不能简单, 绝对的进行比较:
- TCP用于可靠传输的情况, 应用于文件传输, 重要状态更新等场景;
- UDP用于对高速传输和实时性要求较高的通信领域, 例如, 早期的QQ, 视频传输等. 另外UDP可以用于广播;
如何基于UDP实现可靠传输~~
- 引入序列号, 保证数据顺序;
- 引入确认应答, 确保对端收到了数据;
- 引入超时重传, 如果隔一段时间没有应答, 就重发数据;
- …