TCP,UDP各自特点,优缺点,TCP可靠传输/滑动窗口/流量控制/拥塞控制、OSI分层结构。
TCP:面向连接,提供可靠传输;把用户数据报拆分封装成为报文;适合传输大量数据,对可靠性要求较高的场景。
UDP:非面向连接,不可靠;不拆分用户数据报,直接加UDP头;适合传输少量数据,对可靠性要求不高的场景。
UDP没有建立/释放连接、可靠传输、拥塞控制等过程,速度更快。需要应用层自己实现TCP类似的功能。
TCP三次握手过程:
设客户端主机A,服务端主机B通信。
1.A向B发送[连接请求]报文,同步位SYN为1,并随机选择一个序列号seq=x。A进入同步已发送状态。
2.B收到[连接请求]报文后,若同意建立连接,向A发送[连接确认]报文,同步位SYN=1,确认位ACK为1,随机选择一个序列号seq=y,ack=x+1,。B进入同步已接收状态。
3.A收到B的[连接确认]报文后,还要向B发出确认,确认位ACK为1,确认号ack=y+1,序列号seq=x+1。
4.B收到A的确认后,进入连接已建立阶段,可以进行会话。
为什么不能是两次握手:避免失效的连接请求到达服务器,建立无效连接浪费服务器资源。
TCP四次挥手:
1.A向B发送[连接释放]报文,FIN=1,设当前序列号seq=u。
2.B收到[连接释放]报文后向A发出确认,此时TCP进入半关闭状态,B继续向A发送未发送完的数据。
3.当B不在需要连接时,发送连接释放请求,FIN=1。
4.A收到后发出确认,并等待2*MSL。
为什么四次挥手而不是三次挥手:让服务器发送还未发送完的数据。
为什么等待2*MSL:1.确保最后一个确认报文到达了B。如果B没有收到来自A的确认报文,那么会重新发送连接释放报文。2.让本连接持续时间内的所有报文都在网络中消失。
TCP流量控制:
目的:控制发送方速率,保证接收端来得及接收。
实现:接收方的[确认报文]中的窗口字段可以控制发送方窗口大小,从而影响发送端发送速率。
TCP滑动窗口:发送端维护一个发送窗口,包含[已发送但未确认]和[尚未发送]两个部分,发送窗口内的序号都允许被发送。当收到确认时,窗口就会右移,直到左边第一个序号不是[已发送且已确认]状态。接收端维护一个接收端口,接收端只会对按序到达的最后一个序号进行确认,然后右移,直到左边第一个序号不是[已发送确认且交付主机]状态。
TCP如何实现可靠传输:累积确认+超时重传:如果一个报文在超时时间内没有收到确认,就重传该报文。
TCP拥塞控制:
拥塞控制与流量控制的区别:流量控制是为了让接收方来得及接收,发送方被动调节窗口大小。如果网络出现拥塞,大量的报文将丢失,如果采用超时重传机制,无疑会进一步加剧拥塞状况,因此要引入拥塞控制,以降低整个网络的拥塞程度。
拥塞控制算法:慢开始、拥塞避免、快开始、快重传。
(1)慢开始与拥塞避免:
1.发送的最初执行慢开始,拥塞窗口cwnd(congestion window)=1,发送方一开始只能发送一个报文;当收到确认后,将cwnd加倍,因此发送方一次能够发送的的报文数为2,4,8...。
2.设置一个慢开始阈值ssthresh,当cwnd>=ssthresh时,进入拥塞避免,每次cwnd加1。
3.如果出现了超时,则令ssthresh=cwnd/2,cwnd=1,重新开始慢开始过程。
(2)快开始、快重传:
1.当接收到3个重复的确认时,表示下一个报文丢失,此时执行快重传,即重传下一个报文。
2.令ssthresh=cwnd/2,cwnd=ssthresh,直接进入拥塞避免阶段。
分层:
1.物理层:传输比特bit流。
2.数据链路层:传数据帧。
3.网络层:传数据报。
4.传输层:传报文。
5.应用层:Telnet、Ftp、Http、DNS、
分用的实现:
(1)数据链路层分用:当接收到一个数据帧时,根据帧首部中的帧类型进行IP/ARP/RARP分用。
(2)网络层分用:根据[IP数据报]首部中的协议字段进行TCP/UDP/ICMP/IGMP分用。
(3)传输层分用:根据[TCP/UDP报文]首部中的端口号进行分用。
其它:ARP通过IP地址找物理地址,RARP通过物理地址找IP地址。ICMP与IGMP是IP层子协议,属于网络层协议;ICMP主要用于主机与路由器之间传递控制信息,
https://github.com/CyC2018/Interview-Notebook/blob/master/notes/
https://www.zhihu.com/question/38749788