TCP相关面试题

Q1:TCP报文长度是在TCP三次握手中那一次确定的?

这个是关于TCP报文的最大报文段长度mss的相关问题。在TCP连接的前两次握手中(SYN报文中),通信双方都会在选项字段中告知对方自己期待收到最大报文长度(mss值),以双方两个SYN报文中最小的mss最为本次数据传输的mss值。通信双方以“协商”的方式来确定报文长度的,前两次握手是告诉对方自己的mss值,在第三次握手确定mss值

Q2:TCP报文长度是由什么确定的?

这个跟具体传输网络有关,以太网的MTU为1500字节,Internet的MTU为576字节。

MTU是网络层的传输单元,那么MSS = MTU - 20字节(IP首部) - 20字节(TCP首部)。所以以太网的MSS为1460字节,而Internet的MSS为536字节。

Q3:TCP三次握手中,accept函数是发生在TCP三次握手的那个阶段?

服务器端的listen函数:int listen(int sockfd, int backlog);其中sockfd是与某个服务绑定的套接口,backlog是允许阻塞的最大请求个数。

在服务器端存在着两个队列,一个是已经通过三次握手“建立连接的队列“(FIFO with established state)处于Established状态,另一个是“未完成连接的队列”( FIFO with syn_rcvd state)处于SYN_RCVD状态。这两个队列的长度之和就是backlog。在服务器端的accept函数,相当于从“建立连接的队列”中取出一个来进行后续的数据交换。

而三次握手是发生在connect函数中,connect函数执行成功就相当于已经建立三次握手。

Q4:如果TCP连接过程中,第三次握手失败怎么办?

server端发送了SYN+ACK报文后就会启动一个定时器,等待client返回的ACK报文。如果第三次握手失败的话client给server返回了ACK报文,server并不能收到这个ACK报文。那么server端就会启动超时重传机制,超过规定时间后重新发送SYN+ACK,重传次数根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认是5次。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,server自动关闭这个连接。但是client认为这个连接已经建立,如果client端向server写数据,server端将以RST包响应,方能感知到server的错误。

Q5:   三次握手过程中有哪些不安全性

  1)伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送。当大量的攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,服务器主机backlog被耗尽而不能响应其它连接。即SYN泛洪攻击 
  防范措施: 
  1、降低SYN timeout时间,使得主机尽快释放半连接的占用 
  2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文 
  3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由 
  2)当一个主机向服务器发送SYN请求连接,服务器回复ACK和SYN后,攻击者截获ACK和SYN。然后伪装成原始主机继续与服务器进行通信

 

Q6:哪些应用层协议是基于TCP的,哪些是基于UDP的

TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS

UDP:DNS、SNMP、NF

待补充。。。
 

猜你喜欢

转载自blog.csdn.net/qq_19525389/article/details/81516616