TPC/IP
2021-02-20 09:51:15 38 举报
AI智能生成
TPC/IP面试大全
作者其他创作
大纲/内容
TCP基本知识
TCP头部
什么是TCP协议
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议
什么是TCP连接
用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接
如何唯一确定一个 TCP 连接
TCP建立连接
TCP三次握手过程以及状态变迁
第三次握手是可以携带数据的,前两次握手是不可以携带数据的
如何在Linux系统查看TCP状态
netstat -napt
为什么是三次握手,不是两次,四次?
为什么需要三次握手
三次握手才能保证双方具有接收和发送的能力
本质的问题 :为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接
三次握手才可以阻止历史重复连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费
为什么不是两次
无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号
为什么不是四次
三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数
初始ISN是如何产生的
ISN = M + F (localhost, localport, remotehost, remoteport)
M 是一个计时器,这个计时器每隔 4 毫秒加 1。
F 是一个 Hash 算法,根据源 IP、目的 IP、源端口、目的端口生成一个随机数值。要保证 Hash 算法不能被外部轻易推算得出,用 MD5 算法是一个比较好的选择。
既然IP层会分配,为什么TCP层还需要MSS
IP层分片无法保证可靠性,一旦发生分片丢失情况,需要由TCP层负责重传,效率低下
什么是SYN攻击,如何避免SYN攻击
SYN攻击概念
短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态,
但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,
久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务
但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,
久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务
如何避免
调整内核参数,修改 Linux 内核参数,控制队列大小和当队列满时应做什么处理
net.core.netdev_max_backlog 网卡接受数据队列大小
net.ipv4.tcp_max_syn_backlog SYN_RCVD 状态连接的最大个数
net.ipv4.tcp_abort_on_overflow 超出处理能时,对新的 SYN 直接回 RST,丢弃连接
net.ipv4.tcp_syncookies = 1
当 「 SYN 队列」满之后,后续服务器收到 SYN 包,不进入「 SYN 队列」;
计算出一个 cookie 值,再以 SYN + ACK 中的「序列号」返回客户端,
服务端接收到客户端的应答报文时,服务器会检查这个 ACK 包的合法性。如果合法,直接放入到「 Accept 队列」
计算出一个 cookie 值,再以 SYN + ACK 中的「序列号」返回客户端,
服务端接收到客户端的应答报文时,服务器会检查这个 ACK 包的合法性。如果合法,直接放入到「 Accept 队列」
TCP断开连接
TCP四次握手过程以及状态变迁
为什么挥手需要四次
服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次
为什么TIME_WAIT等待的是2MSL
网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间
为什么需要TIME_WAIT状态
防止具有相同「四元组」的「旧」数据包被收到;
保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;
TIME_WAIT过多有什么危害
内存资源占用
占用端口
如何优化TIME_WAIT
net.ipv4.tcp_tw_reuse=1 和 tcp_timestamps=1
当客户端与服务端主机时间不同步时,客户端的发送的消息会被直接拒绝掉
net.ipv4.tcp_max_tw_buckets
当系统中处于 TIME_WAIT 的连接一旦超过这个值时,系统就会将所有的 TIME_WAIT 连接状态重置
程序中使用 SO_LINGER
调用close后,会立该发送一个RST标志给对端,该 TCP 连接将跳过四次挥手,也就跳过了TIME_WAIT状态,直接关闭
TCP保活机制
net.ipv4.tcp_keepalive_time=7200
表示保活时间是 7200 秒(2小时),也就 2 小时内如果没有任何连接相关的活动,则会启动保活机制
net.ipv4.tcp_keepalive_intvl=75
表示每次检测间隔 75 秒
net.ipv4.tcp_keepalive_probes=9
表示检测 9 次无响应,认为对方是不可达的,从而中断本次的连接
Socket编程
针对TCP应该如何Socket编程
listen时backlog的意义
表示检测 9 次无响应,认为对方是不可达的,从而中断本次的连接。
0 条评论
下一页