努力经营当下,直至未来明朗!
一个人最大的痛苦来源于对自己无能的愤怒
Hi,这里还是不想秃头的宝贝儿!要努力不秃头啊!
本文主要介绍的是TCP提高效率的机制:延迟应答、捎带应答,以及TCP面向字节流的特性以及TCP的异常处理。
【回顾TCP】
① 确认应答:保证可靠传输的最核心机制
② 超时重传
③ 连接管理:三次握手(投石问路、发送能力和接收能力、协商参数)、四次挥手
④ 滑动窗口
⑤ 流量控制(通过接收方的处理能力/内核剩余接收缓冲区 来对发送方作出限制)
⑥ 拥塞控制(中间节点)
【延迟应答】:提高传输效率的机制
在自定义应用层协议中有几个典型的实现:
①XML:分隔符就相当于结束标签
②JSON:分隔符就相当于}
③Protobuffer:里面通过申明长度的方式来确定边界
④HTTP:分隔符和长度两个都会用到
2)正常关机(通过开始菜单这种方式来关闭主机)
关机的时候系统会先强制结束所有的用户进程,和上述的进程崩溃类似,系统内核会进行文件描述符表的释放操作,从而进一步进行四次挥手。
3)断电关机(主机掉电)
非常突然,猝不及防。
① 掉电的是接收方,发送方并不知道对面已经挂了,会继续发送数据。
但是此时发送的数据就没有ACK返回,发送方就会触发超时重传;重传了几次之后仍然没有应答,此时就会尝试重置连接(通过复位报文段),但是也会失败;此时就会直接放弃连接。
【复位报文段其实就是TCP报头中特殊标志位中的RST,为1就是有效的】
(补充:特殊标志位中:PSH:向对方所要数据,希望对方给个回应; URG:跟紧急指针相关)
② 掉电的是发送方,此时接收方就只能等着。
但是接收方也不是干等,等了一段时间之后就会发送一个“心跳包”,心跳包是周期性触发的,只是一个简单的不携带任何业务数据的包,存在的意义就是确认一下对方是否还在。
如果对方不返回心跳包,说明此时对方已经挂了。
4)网线断开
情况同主机掉电类似,只不过通信双方的主机都正常,这两端各自按照上述两种情况分别进行。
【TCP和UDP之间各自的应用场景对比】:
① TCP使用在有可靠性要求的场景中,使用TCP是非常广泛的。
② UDP用在对于可靠性要求不高,但是对于传输效率要求比较高的场景中。如机房内部的内网传输:【不容易丢包:带宽比较充裕,且网络结构相对简单】+【传输效率要求也比较高】
注:传输层并不是只有TCP和UDP两个协议的,还有其他协议:
像平时玩的LOL等实时性要求较高的游戏,一般既需要保证可靠性又需要保证效率,所以此时就可以使用KCP(但是不详细介绍)
3.【常见面试题】——经典
如何使用UDP来实现可靠传输?
(主要考查的其实是TCP)
其实就是基于UDP在应用层来实现确认应答、超时重传、引入序列号、滑动窗口(会确认都收到才滑到下一个)等等。(自己补充完善)
校验和 、序列号(按序到达)、 确认应答、 超时重传、 连接管理(三次握手、四次挥手)、 流量控制、 拥塞控制。
2)提高性能:
滑动窗口 、快速重传 、延迟应答 、捎带应答
3)其他:
定时器(超时重传定时器,保活定时器,TIME_WAIT定时器等)
HTTP、 HTTPS、 SSH 、Telnet 、FTP、 SMTP
当然,也包括你自己写TCP程序时自定义的应用层协议