终端开发所必知道的计算机网络知识(二)

前言

《终端开发所必知道的计算机网络知识(一)》已经总结了物理层、数据链路层、网络层各层的一些知识点,今天这篇主要讲我们平时开发接触频率最高的两层之一:传输层。

传输层

负责主机中进程间的通信及传输数据

关键协议

TCP、UDP

TCP与UDP区别

TCP:面向连接、可靠的流协议
场景:效率要求相对低,对准确性要求相对高的场景,文件传输、接受邮件、远程登录。
UDP:不可靠的数据报协议
场景:效率要求相对高、对准确性要求相对低的场景,QQ聊天、在线视频、网络语音电话。
TCP或UDP通信中通常使用5个信息来识别一个通信:“源IP地址”、“目标IP地址”、“源端口号”、“目标端口号”以及“协议号”

UDP

UDP头部


UDP头部是由源端口号目标端口号包长校验和组成。checksum主要是用来检测UDP段在传输中是否发生了错误。

TCP

TCP通过校验和序列号确认应答重发控制连接管理以及窗口控制这些机制实现可靠性传输

连接过程


连接与关闭需要三次握手四次挥手,来回发送7个包。
在TCP中,当发送端的数据到达主机时,接收端主机会返回一个已收到消息的确认通知,这个消息叫ACK
序列号是按照顺序给发送数据的每一个字节都标上号码的编号,接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答号返送回去。通过序列号确认应答号,TCP实现可靠传输。

为什么不是两次握手而是要三粗握手呢?
简易点回答,就是三次握手才能保证双方都能确认能够收到对方的消息建立连接,而两次握手只能确认服务器端能收到消息,服务器端无法确认客户端是否能收到自己的消息。

当第三次握手失败时,TCP如何让处理?
当第三次握手失败时接收方服务器并不会重传SYN/ACK报文,而是直接发送RTS报文段进入CLOSED状态,这样做的目的是为了防止SYN洪泛攻击。这个 RST 数据包的 TCP 首部中,控制位中的 RST 位被设置为 1,这表示连接信息全部被初始化,原有的 TCP 通信不能继续进行,客户端如果还想重新建立 TCP 连接,就必须重新开始第一次握手
泛洪攻击,是指发送方伪造多个 IP 地址,模拟三次握手的过程,当服务器返回 ACK 后,攻击方故意不确认,从而使得服务器不断重发 ACK,由于服务器长时间处于半连接状态,最后消耗过多的 CPU 和内存资源导致死机。
半连接状态,是指服务器维护一个半连接队列,该队列为每个客户端SYN包开设一个条目,标明服务器已经接到SYN包,并向客户端发出确认,这些条目表示的连接处于SYN_RECV状态,得到客户端的确认后进入ESTABLISHED状态。

当第四次挥手失败时,TCP如何处理?
第四次挥手失败,也就是最后一个ACK丢失,TCP就会认为它的FIN丢失,服务器端会重发FIN。在客户端收到FIN后,就会设置一个2MSL计时器,2MSL计时器可以使客户端等待足够长的时间,即使在ACK丢失的情况下,也可以等到下一个FIN的到来。如果在TIME-WAIT状态前有一个新的FIN到达了,客户就会发送一个新的ACK,并重新设置2MSL计时器。
如果重传FIN到达客户端时,客户端已经进入CLOSED状态时,那么客户端就永远收不到这个重传的FIN报文段,服务器收不到ACK,服务器无法关闭连接。但是服务器并不会一直无法关闭,服务器会进行不断的探查,会发送十个间隔为75秒的探查,如果探查都没有收到回应,则认为客户端已经关闭,服务器也将关闭,终止链接

重传超时时间(RTO)
如果发送方等待一段时间后,还是没有收到 ACK 确认,就会启动超时重传,这个等待的时间被称为重传超时时间(RTO,Retransmission TimeOut)。RTO 的值具体是多久呢?

top Created with Sketch.