开发者学堂课程【Linux网络进阶 - TCP/IP协议及OSI七层模型:CCNP 必备:Linux 网络抓包和 TCP 的三次握手】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/552/detail/7628
CCNP 必备:Linux 网络抓包和 TCP 的三次握手(三)
六、客户端的典型状态转移
客户端通过 connect 系统调用主动与服务器建立连接 connect 系统调用首先给服务器发送一个同步报文段,使连接转移到 SYN_SENT 状态
此后 connect 系统调用可能因为如下两个原因失败返回:
1、如果 connect 连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于 TIME_WAIT 状态的连接所占用(见后文),则服务器将给客户端发送一个复位报文段,connect 调用失败。
2、如果目标端口存在,但 connect 在超时时间内未收到服务器的确认报文段,则 connect 调用失败。
Connect 调用失败将使连接立即返回到初始的 CLOSED 状态。如果客户端成功收到服务器的同步报文段和确认,则 connect 调用成功返回,连接转移至 ESTABLISHED 状态。
处于 FIN_WAIT_2 状态的客户端需要等待服务器发送结束报文段,才能转移至 TIME_WAIT 状态,否则它将一直停留在这个状态。
如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在 FIN_WAIT_2 状态并无益处。
连接停留在 FIN_WAIT_2 状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。
此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似,占用内存资源)
Linux 为了防止孤儿连接长时间存留在内核中,定义了两个内核参数:/proc/sys/net/ipv4/tcp_max_orphans (指定内核能接管的孤儿连接数目)孤儿连接太多会占用内存资源。
/proc/sys/net/ipv4/tcp_fin_timeout (指定孤儿连接在内核中生存的时间60秒)
Syn(半连接)攻击:
如果想要把对方的服务器拖垮,可以假装一个客户端发起请求,对方响应后发出SYN=1,ACK=1。但是没有第三步了而且客户端的发出地址是伪造的。服务器等待的时候会占用内存,造成服务器瘫痪。
可以安装防火墙等手段来预防。
下图为各种状态的复合图。虚线为服务器端发送的;实线为客户端发送的。
下图为三次握手四次挥手总结图
前三次为三次握手,中间是传数据,最后则是分手。
首先建立连接,ctrl+c强行断开连接。前三次为三次握手,中间是传数据,最后则是分手。
例如:
两个主机之间各有两个程序在通讯。当两个软件分别进行连接的时候。浏览器访问外国网站,这时就有三次握手。有几个应用程序通讯,就有几个握手,几个分手。
开始时客户端为断开连接状态,连接服务器发送同步包变为sent状态,对方回应syn和ack,同时切换到estabilished状态,如果想断开连接则发送fin,进入wait1,等待对方发确认,如果对方回应ack则进入wait2,同时发送ack,接收fin,进入time wait 等待30秒后完成断开
TCP的各种特性
1.面向连接
2.可靠
3.可基于半关闭
Ack=1代表0包已经收到了。
七、TCP 超时重传
异常网络状况下(开始出现超时或丢包),TCP 控制数据传输以保证其承诺的可靠服务
TCP 服务必须能够重传超时时间内未收到确认的 TCP 报文段。为此,TCP 模块为每个 TCP 报文段都维护一个重传定时器,该定时器在 TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP 模块将重传 TCP 报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是 TCP 的重传策略
与 TCP 超时重传相关的两个内核参数:
/proc/sys/net/ipv4/tcp-retries1,指定在底层 IP 接管之前 TCP 最少执行的重传次数,默认值是3
/proc/sys/net/ipv4/tcp_retries2,指定连接放弃前 TCP 最多可以执行的重传次数,默认值 15(一般对应13~30min)
固定窗口:
滑动窗口: