这是一些在学习过程中关于计算机网络八股文的一些知识点记录:
TCP/UDP
TCP怎么保证可靠性
1.序列号,确认应答,超时重传
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。
2.窗口控制与高速重发控制/快速重传
TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。
简述一下TCP建立连接与断开连接的过程
注意:要注意到每一步他们的状态变化。
下面就有一个状态变化图:
ESTABLISHED
: 表示连接已经建立。三次握手完成
FIN_WAIT_2
: 主动关闭链接的一方,发出 FIN
收到 ACK
以后进入该状态。 称之为半连接或半关闭状态。 该状态下的 socket 只能接收数据,不能发。
TIME_WAIT
: 表示收到了对方的 FIN
报文,并发送出了 ACK
报文,等 2MSL
后即可回到 CLOSED
可用状态。主动发起连接的才会处于该状态…等 2MSL
的目的是确保主动关闭端发送的最后一个 ACK
能到达对端…TIME_WAIT
的时长是 2MSL
,不要说 1min,2min
之类的!!!
TCP的三次握手和四次挥手的原因是什么?
为什么三次握手?
- 三次握⼿才可以阻⽌重复历史连接的初始化(主因):比如当旧的SYN报文在某一网络节点长时间滞留,在到达服务端时,客户端可以通过自己上下文判断这个是一个历史连接(序列号过期或超时),会发送一个RST,终止连接。如果是两次连接的话两次握⼿在收到服务端的响应后开始发⽣数据,不能判断当前连接是否是历史连接。 三次握⼿可以在客户端准备发送第三次报⽂时,客户端因有⾜够的上下⽂来判断当前连接是否是历史连接
- 三次握⼿才可以同步双⽅的初始序列号:两次握⼿只保证了⼀⽅的初始序列号能被对⽅成功接收,没办法保证双⽅的初始序列号都能被确认接收。
- 三次握⼿才可以避免资源浪费:两次握⼿会造成消息滞留情况下,服务器重复接受⽆⽤的连接请求 SYN 报⽂,⽽造成重复分配资源;只有两次握⼿时,如果客户端的SYN请求连接在⽹络中阻塞,客户端没有收到服务端的ACK报⽂,会重新发送SYN;由于没有第三次握⼿,服务器不清楚客户端是否收到了⾃⼰发送的建⽴连接的 ACK 确认信号,所以每收到⼀个SYN 就只能先主动建⽴⼀个连接。
为什么是四次挥手?
TCP协议是全双工通信,这意味着客户端和服务器端都可以向彼此发送数据,所以关闭连接是双方都需要确认的共同行为。所以客户端收到FIN报⽂,先回⼀个ACK应答报⽂,服务端可能还要数据需要处理和发送,等到其不再发送数据时,才发送FIN报⽂给客户端表⽰同意关闭连接。所以服务端的ACK和FIN⼀般都会分开发送,从⽽⽐三次握⼿导致多了⼀次。
假设是三次挥手时,首先释放了A到B方向的连接,此时TCP连接处于半关闭(Half-Close)状态,这时A不能向B发送数据,而B还是可以向A发送数据。如果此时A收到了B的确认报文段后,就立即发送一个确认报文段,这会导致B向A还在发送数据时连接就被关闭。这样会导致A没有完整收到B所发的报文段
TCP,UDP的区别是什么?
- TCP是面向字节流,UDP面向的是数据报的
- TCP是面向连接的,UDP是面向无连接的
- TCP可以保证数据安全有序,UDP不保证
- TCP复杂,UDP程序简单
- TCP只能单对单,点对点,UDP支持一对一,一对多,多对多通信
- TCP⾸部长度不适⽤选项字段是20字节,使⽤选项字段长度增加(可变),UDP⾸部固定8字节。
- TCP数据⼤于MSS时会在TCP层将数据进⾏分⽚传输,到达⽬的地后同样在传输层进⾏合并,如果有某个⽚丢失则只需要重传丢失的分⽚即可; UDP数据⼤于MTU时会在IP层分⽚,同样也在⽬的IP层合并,如果某个IP分⽚丢失,则需要将所有分⽚都进⾏重传,开销⼤
TCP,UDP的优缺点是什么?
TCP优点:
可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
TCP缺点:
慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
UDP优点:
快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。
UDP缺点:
不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。
TCP、UDP适用的场景?
TCP应用场景
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录
UDP应用场景
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话
TCP相比UDP为什么是可靠的?
1.确认和重传机制:建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。
2.数据排序:TCP有专门的序列号字段
3.流量控制:窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量
4.拥塞控制:TCP的拥塞控制由4个核心算法组成。“慢启动”(Slow Start)、“拥塞避免”(Congestion avoidance)、“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery)。
什么事TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?
拥塞控制
如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵(大家都在用网,你在这狂发,吞吐量就那么大,当然会堵),甚至造成网络的瘫痪。所以TCP在为了防止这种情况而进行了拥塞控制。
慢启动
定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个rtt),将拥塞窗口大小*2。
拥塞避免
设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个rtt,拥塞窗口大小+1),以此来避免拥塞。
将报文段的超时重传看做拥塞,则一旦发生超时重传,我们需要先将阈值设为当前窗口大小的一半,并
且将窗口大小设为初值1,然后重新进入慢启动过程。
快速重传
在遇到3次重复确认应答(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便对它进行立即重传。然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3的大小。
这样可以达到:在TCP通信时,网络吞吐量呈现逐渐的上升,并且随着拥堵来降低吞吐量,再进入慢慢
上升的过程,网络不会轻易的发生瘫痪。
采用慢开始和拥塞避免算法的时候
- 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度
- 一旦出现丢包的情况,就重新进行慢开始,减慢增长速度
采用快恢复和快重传算法的时候
- 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度
- 一旦发送方连续收到了三个重复确认,就采用拥塞避免算法,减慢增长速度
OSI与TCP模型
TCP/IP数据链路层的交互过程是怎么样的?
网络层等在数据链路层用MAC地址作为通信目标,数据包到达网络层等往数据链路层发送的时候,首先回去ARP
缓存表去查找ip对应的MAC地址,如果查到了,就将此ip对应的MAC地址封装到链路层数据包的包头。如果缓存中没有找到,则会发起一个广播,who is ip xxx tell ip xxxx
,所有收到广播的机器看到这个ip是不是自己的,如果是自己的,则以单播的形式将自己的mac地址回复给请求机器。
传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文?
根据端口号可以查看区分需要接受到的程序;
根据IP协议头中的标识字段:UDP 17、TCP 6
请说说你对TCP连接中time_wait状态的理解
time_wait是如何产生的
首先调用close()
发起主动关闭的一方,在发送最后一个ACK
之后会进入time_wait
的状态,也就说该发送方会保持2MSL
时间之后才会回到初始状态。MSL值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。
time_wait状态产生的原因是:
1.实现TCP全双工连接的可靠释放
假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED
状态。如果主动关闭一方不维护这样一个TIME_WAIT
状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。
2.防止具有相同四元组的旧数据包被收到
经过 2MSL 这个时间,⾜以让两个⽅向上的数据包都被丢弃,使得原来连接的数据包在⽹络中都⾃然消失,再出现的数据包⼀定都是新建⽴连接所产⽣的。
time_wait过多的危害:
1.内存资源占用;
2.对端口资源的占用,一个TCP连接至少消耗一个本地端口;
如果发起连接⼀⽅的 TIME_WAIT 状态过多,占满了所有端⼜资源,则会导致⽆法创建新连接。
time_wait状态的避免
首先服务器可以设置SO_REUSEADDR
套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT
状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR
选项就可以避免TIME_WAIT
状态。
为什么要设置time_wait
1.保证A发送的最后一个ACK报文能够到达B。也就是上面提到的保证全双工连接的可靠释放
2.A在发送完最后一个ACK报文段后,经过2MSL后,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,也就是为了防止具有相同四元组的旧数据包被收到。
针对OSI七层模型和TCP/IP四层模型,每一层都举例出一两个协议:
OSI七层协议:
- 物理层:通过媒介传输比特,主要包括的协议为:
IEE802.3
CLOCK RJ45
- 数据链路层:将比特组装成帧和点到点的传递,传输单位为帧,主要包括的协议为
MAC
VLAN
PPP
- 网络层:负责数据包从源到宿的传递和网际互连,传输单位为包,主要包括的协议为
IP
ARP
ICMP
- 传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,主要包括的协议为
TCP
UDP
- 会话层:建立、管理和终止会话,传输单位为SPDU,主要包括的协议为
RPC
NFS
- 表示层:对数据进行翻译、加密和压缩,传输单位为PPDU,主要包括的协议为
JPEG
ASII
- 应用层:允许访问OSI环境的手段,传输单位为APDU,主要包括的协议为
FTP
HTTP
DNS
TCP/IP四层协议:
-
网络接口层
-
网络层:
IP
协议、ICMP
协议、ARP
协议、RARP
协议。 -
传输层:
UDP
协议、TCP
协议 -
应用层:
FTP
(文件传送协议)、Telnet
(远程登录协议)、DNS
(域名解析协议)、SMTP
(邮件传送 协议),POP3
协议(邮局协议),HTTP
协议