1、TCP三大特点:面向连接、可靠、基于字节流
2、如何唯一确定一个TCP连接?TCP四元组:源地址、源端口、目的地址、目的端口
- 源地址和目标地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机
- 源端口和目标端口的字段(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程
3、有一个 IP 的服务端监听了一个端口,它的 TCP 的最大连接数是多少?
比如MySQL监听了6306端口,那么它最多能连接多少个TCP信道
4、TCP和UDP可以绑定同一个端口吗?可以的
问题「TCP 和 UDP 可以同时监听相同的端口吗?」表述有问题,这个问题应该表述成[ TCP 和 UDP 可以同时绑定相同的端口吗?」因为「监听」这个动作是在 TCP 服务端网络编程中才具有的,而 UDP 服务端网络编程中是没有「监听」这个动作的。TCP 和 UDP 服务端网络相似的一个地方,就是会调用 bind 绑定端口。
首先,传输层的「端口号」的作用,是为了区分同一个主机上不同应用程序的数据包。传输层有两个传输协议分别是 TCP 和 UDP,在内核中是两个完全独立的软件模块,所以互不影响。当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP 协议,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。
在网络接口层中,通过 MAC 地址来寻找局域网中的主机。在网络层中,通过IP 地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口进行寻址,来识别同一计算机中同时通信的不同应用程序。
5、TCP连接建立过程(三次握手)
6、如何在Linux系统中查看TCP状态?
7、为什么是三次握手?不是两次、四次?
因为三次握手才能保证双方具有接收和发送的能力
8、为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?
主要原因有两个方面:
- 为了防止历史报文被下一个相同四元组的连接接收(主要方面)
- 为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收
9、既然 IP 层会分片MTU,为什么 TCP 层还需要 MSS 呢?
核心原因:IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传
首先认识一下MTU和MSS:
10、TCP连接时第一次握手丢失了会发生什么?
11、第二次握手丢失了会发生什么?
12、什么是SYN攻击?
13、TCP 半连接和全连接队列
在 TCP 三次握手的时候,Linux 内核会维护两个队列,分别是:
- 半连接队列,也称 SYN 队列
- 全连接队列,也称 accept 队列
- 当服务端接收到客户端的 SYN 报文时,会创建一个半连接的对象,然后将其加入到内核的「 SYN 队列」
- 接着发送 SYN + ACK 给客户端,等待客户端回应 ACK 报文
- 服务端接收到 ACK 报文后,从 「SYN 队列」取出一个半连接对象,然后创建一个新的连接对象放入到 [ Accept 队列」
- 应用通过调用 accpet() 的 socket接口,从「Accept队列」取出连接对象
14、如何解决SYN攻击?
SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满,这样当 TCP 半连接队列满了,后续再在收到SYN 报文就会丢弃,导致客户端无法和服务端建立连接,所以说避免 SYN 攻击方式,有以下四种方法:
- 调大 netdev max backlog
- 增大 TCP 半连接队列
- 开启 tcp_syncookies
- 减少 SYN+ACK 重传次数