1.如何理解TCP的三个特点:面向连接、字节流、可靠传输?

面向连接:使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成数据交换不再使用该连接之后,通信双方都必须断开连接,以释放资源。并且TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机)的应用程序不能使用TCP服务。而无连接的UDP协议则非常适用于广播和多播

字节流:被发送的TCP报文先被放入TCP发送缓冲区,在真正发送时,在缓冲区内的数据被封装成一个或多个TCP报文,接收端也是如此,所以TCP发送端的写操作次数和接收端的读操作次数是没有数量关系的,也就是说应用程序对数据的发送和接收是没有边界限制的。

可靠传输:首先是,TCP协议采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为TCP报文段传输成功。其次,TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段。最后,因为TCP报文段最终是以IP数据报发送的,而IP数据报达到接收端可能乱序、重复,所以TCP协议还会对收到的TCP报文进行重排、整理,再交付给应用层。

 

2.为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

 

3.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

  • 可靠地终止TCP连接:若确认关闭报文段丢失,则客户端需要在这段时间内等待接收服务器重发的结束报文段。
  • 保证让迟来的TCP报文段有足够的时间被识别并丢弃:2MSL可确保在网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经消失。确保一个新的TCP连接可以安全的建立而不会接收到上一个TCP连接的数据。(这也是为什么当有些和TCP相关的程序退出后,我们无法立即启动它的原因)

 

4.什么是SYN攻击?

在三次握手过程中,服务器发送在SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。

SYN攻击就是客户端在短时间内伪造大量不存在的IP地址,并向服务器不断地发送SYN包,服务器回复确认包,并为该请求分配一个任务控制块TCB(Transmission Control Block),然后等待客户端的确认,由于源地址是不存在的(或者源地址不知晓),因此,服务器需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列和服务器资源,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。

 

5.如何避免SYN攻击?

比较蠢的办法:增大队列SYN最大半连接数、减小超时值

1.延时分配TCB 。当正常连接建立起来后再分配TCB则可以有效地减轻服务器资源的消耗。
  常见的方法是使用SYN CacheSYN Cookie技术。

2.使用SYN Proxy防火墙。防火墙中都提供一种 SYN代理的功能,其主要原理是对试图穿越的SYN请求进行验证后才放行。

 

6.TCP协议如何保证可靠传输?

校验和
确认应答和***
超时重传
连接管理
流量控制
拥塞控制

 

7.TCP滑动窗口?

 

 

8.TCP与UDP的特点比较?

连接机制:
    TCP 是面向连接的传输层协议,需要占用内核资源多
    UDP 是不需要连接的,资源占用少
服务对象:
    TCP 是一对一的两点服务
    UDP 支持一对一、一对多、多对多
可靠性:
   TCP 保证数据不丢失、不重复、按需到达
   UDP 是尽最大努力交付,不保证交付数据
速度:
    UDP速度快于TCP
数据流:
    TCP是字节流,没有边界限制
    UDP是数据报流,需要以个体为单位发送和读取
拥塞控制、流量控制:
   TCP 有拥塞控制和流量控制机制
   UDP 则没有拥塞控制和流量控制机制
 

9.TCP和UDP应用场景?

TCP可靠稳定,可以使得整个数据准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等文件传输协议,POP、SMTP等邮件传输的协议。

要求网络通讯速度能尽量的快,这时就可以使用UDP。实时语音视频通话、实时游戏、TFTP等。

 

10.简述三次握手和四次挥手?

三次握手:

面试中常问的关于TCP协议的问题

  • 服务器与客户端均处于CLOSE状态
  • 服务器先主动监听某端口,处理LISTEN状态
  • 客户端主动连接,发送SYN报文,seq=x,进入SYN_SEND状态。
  • 服务器回复SYN+ACK报文,seq=y,ack=x+1,并且进入SYN_RCVD状态。
  • 客户端回复ACK报文,ack=y+1,进入连接状态
  • 服务器收到ACK报文,进入连接状态。

 

四次挥手:

面试中常问的关于TCP协议的问题

  • 服务器与客户端均处于ESTABLISHED状态
  • 客户端打算关闭连接,发送一个 FIN 报文,进入 FIN_WAIT_1 状态。
  • 服务端回复 ACK报文,进入 CLOSED_WAIT 状态。
  • 客户端收到 ACK 应答报文后,进入 FIN_WAIT_2 状态。
  • 服务端处理完数据后,向客户端发送 FIN 报文(也含有ACK),进入 LAST_ACK 状态。
  • 客户端回复一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务器收到 ACK 应答报文后,进入了 CLOSE 状态,服务端完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,客户端也完成连接的关闭。

 

11. 什么是TCP的保活机制?

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

TCP的保活机制详解

 

12. 已经建立连接,客户端故障怎么办?

这种情况就会触发TCP的保活机制,对应的参数包括保活时间、保活探测的次数、保活探测的时间间隔,其中保活时间默认为7200秒,保活探测次数为9,保活探测时间间隔为75秒。

也就意味着,如果客户端突然故障,会经过7200+75*9=7875秒即2小时11分15后,服务器才会判断该连接失效,以上参数可以手动设置。

 

13.三种产生复位报文段的3种情况?

  • 访问不存在的端口:当客户端程序访问一个不存在的端口时(或者处于TIME_WAIT状态),目标主机将给它发送一个复位报文段。
  • 异常终止一个连接的办法:通过给对方发送一个复位报文段,使发送端所有排队等待的数据都被丢弃,实现终止。
  • 处理半打开连接:如果客户端(或服务器)处于半打开状态的连接写入数据,则对方将回应一个复位报文段。
    (半打开状态的连接:一端关闭或异常终止,另一端没有收到其结束报文段,导致另一端还保持着原连接)

 

 

 

 

 

相关文章: