6

前言:前几天有幸看到面试题目收集中的面试题目总结,觉得既容易又复杂。容易是因为都知道一点,复杂是因为在自己学习过程中没有细致的总结过这些知识点,这是我这样的EE转CS的非科班生的背景伤。所以打算针对其中的单个知识点,进行系统的总结归纳。如果有不正确的地方,请在评论中指出,不胜感激!

问题:说说TCP传输的三次握手四次挥手策略。

要理解握手和挥手,必须了解TCP的报文段,如下图所示。在连接和连接过程中用到的有sequence number(序号)、acknowledgment number(确认号)、SYN、FIN、ACK比特字段。
图片描述

为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。发送端首先发送一个带SYN=1标志和初始序列号(seq = clien_isn)的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的报文段以示允许连接。该报文段包括:SYN=1,确认号字段被置为ack=clien_isn+1,序号字段被指为服务器自己的初始序号seq=sever_isn。最后,发送端再回传一个带ACK标志的数据包,SYN=1,确认号字段置为ack=server_isn+1,代表“握手”结束。具体如下图。若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。

断开一个TCP连接则需要“四次挥手”:

第一次挥手:主动关闭方发送一个FIN=1,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN=1,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
图片描述

TCP和UDP的区别:(连接?可靠?拥塞控制?)

1)TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次握手才能建立起来。
2)TCP提供可靠的数据传输服务,通信进程能够依靠TCP无差错、有序交付所有数据。
3)TCP具有拥塞控制机制,该服务在发送方和接收方之间的网络出现拥塞时,抑制发送进程。这可能导致进程通信变慢,但是对网络整体通信有好处。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。
1)它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!(延时小)
2)UDP提供不可靠数据传输服务,不保证报文到达,也不保证有序到达。这种不可靠数据传输服务包括进程间的数据交付和差错检查两种服务,是运输层协议实现的最低限度服务。
3)UDP没有拥塞控制机制,所以UDP可以用他选定的任何速率向下层(网络层)传输数据(速度有保证)。

综合以上大致可以得出两者的适用应用:UDP适用于对可靠性要求不高的应用环境,但是对数据传输速率有最小限制且对延时有要求,例如因特网电话。TCP适用于对数据传输可靠性要求较高的应用,web的HTTP协议就使用TCP进行数据传输。具体应用列举如下(《计算机网络:自顶向下方法》):
图片描述

UDP相对TCP的优势:

(1)无延时。只要应用进程将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立即传递给网络层。但是TCP可能会因为拥塞阻塞机制阻止运输层TCP发送方,并且一直等待,直到可以发送,这会增加时延。对实时应用,少量数据损耗并不影响,但延时不能太大,这最好使用UDP,如网络电话。
(2)UDP无需连接建立,相比TCP节省了三次握手时间。DNS使用UDP协议,主要是因为UDP不需要建立连接,节省了握手时间,如果运行在TCP上,DNS会很慢。
(3)UDP无连接状态,而TCP需要维护连接状态,这包括维持一些参数,因此使用UDP可以使服务器同时支持更多用户。
(4)分组开销小,UDP使用8字节首部开销(各两字节:源端口号、目的端口号、长度、检验和),TCP使用20字节首部开销。这个可以从下图UDP的报文段结构看出。


zhangding
358 声望23 粉丝

JavaScript+React+Redux