阅读《Linux高性能服务器编程》随笔——TCP连接的建立与关闭

TCP标志位

TCP标志位的值代表了当前请求的目的。
标志位一共有6种,分别是:

  1. SYN(synchronous): 发送/同步标志,用来建立连接,和下面的第二个标志位ACK搭配使用。连接开始时,SYN=1,ACK=0,代表连接开始但是未获得响应。当连接被响应的时候,标志位会发生变化,其中ACK会置为1,代表确认收到连接请求,此时的标志位变成了 SYN=1,ACK=1。
  2. ACK(acknowledgement):确认标志,表示确认收到请求。
  3. PSH(push) :表示推送操作,就是指数据包到达接收端以后,不对其进行队列处理,而是尽可能的将数据交给应用程序处理;
  4. FIN(finish):结束标志,用于结束一个TCP会话;
  5. RST(reset):重置复位标志,用于复位对应的TCP连接。
  6. URG(urgent):紧急标志,用于保证TCP连接不被中断,并且督促中间层设备尽快处理。

此外,还有两个序号:

  1. Sequence number :顺序号,发送数据包中的第一个字节的序列号,一般为小写的seq。
  2. Acknowledge number:确认号,响应前面的seq,值为seq+1,可以理解为期望下次发出的序列号为seq+1;

TCP连接的建立和关闭

  1. 使用tcpdump观察TCP连接的建立和关闭
sudo tcpdump -i ppp0 -nt '(src 10.69.43.117 and dst 220.181.38.149) or (src 220.181.38.149 and dst 10.69.43.117)'
  • 参数含义:监听两个IP地址之间相互发送的数据包
  1. 在另一终端,使用telnet命令,与目的端口建立tcp连接。
talent 220.181.38.149 80
  • telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。
  1. 监听结果:
    在这里插入图片描述
    总共有七条结果,前三条为TCP建立连接的三报文握手,后四条是TCP关闭连接的四报文挥手。
    解析报文:
  • 第一条,表示源地址10.69.43.117,使用53796端口(此端口不固定,是由用户进程进行分配),向目标主机220.181.38.149,端口80(80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的),发送一个连接请求。因为它的标志位是[S],即SYN=1,是一个同步报文段。同时附带一个序号seq(src)。

  • 第二条,表示目的主机,向源主机发送的一个同步报文段。表示该主机同意与源主机建立连接,标志位为SYN=1,同时附带自己的一个序号位seq(dst),并且对第一条报文进行确认,确认值是seq(src)+1。序号值seq,是用来标识TCP数据流中的每一字节的,因此每个TCP报文,都会消耗一个序号值。

  • 第三条,表示源主机对第二条同步报文段的确认。至此,TCP连接就建立起来了。
    在这里插入图片描述

  • 第四条,由源主机发起关闭连接请求(双方都可以发送关闭连接请求)。因为报文段包含FIN标志,因此它是一个结束报文段。也要占用一个序号,序号seq的值为seq(src)+1。但显示的seq为1,实质上是相对初始seq值的偏移。ack的值为1。

  • 第五条,目的主机对关闭连接请求的确认。也就是对第四条报文的确认,ack=2

  • 第六条,目的主机发送完第五条后,目的主机立马发送自己的结束报文段。seq=1(实际是seq(dst)+1).

  • 第七条,源主机发送自己对第六条报文的确认。至此,TCP连接关闭。

在这里插入图片描述

因为TCP连接的建立和关闭所使用的报文,其内容都是空,所以length=0

相关知识点

针对TCP连接的安全问题:SYN攻击

  • 危害:SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。
  • 原理:在三次握手过程中,服务器发送SYN-ACK(确认收到客户端请求的连接)之后,收到客户端的ACK(第三个包)之前的TCP连接称为半连接(half-open connect).此时服务器处于SYN_RECV(等待客户端相应)状态,如果接收到客户端的ACK,则TCP连接成功,如果未接受到,则会重发请求直至成功。SYN攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,影响了正常的SYN,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
  • 检测:检测SYN攻击非常的方便,当在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。
  • 防范:主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。

过滤网关防护:
1. 网关超时设置
2. SYN网关
3. SYN代理
4. 加固TCP/IP协议栈:
SynAttackProtect机制
5. SYN cookies技术
6. 增加最大半连接数
7. 缩短超时时间

1.为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当客户端发起关闭连接的请求时,发出的FIN,仅表示客户端已经发送完自己的所有数据了。而此时的服务端,可能还没有全部接收到所有传输的数据,或者仍有向客户端发送的数据,如果此时就确认关闭连接,会导致数据的不完整。因此服务端会先发送一个响应报文,表示服务端收到了FIN请求,而后在数据传输完之后,再发送一个FIN请求,表示服务端也做好断开连接的准备了,所以关闭连接的时候是四次握手。

2.为什么不能用两次握手进行连接?

为了实现可靠传输,客户端和服务端始终都需要一个同步序号(SYNchronize),序号并不是从0开始,而是由发送方自己随机产生的一个初始序列号(Initial Sequence Number, ISN , 也叫做seq)开始。例如,客户端发送一个TCP连接请求,附带的seq=10000,如果服务端收到了这个请求,返回一个接受请求的同步报文,就会发送一个报文,附带自己的seq=20000,ack=10001 ,这个ack的意思就是表示期望下一个接收的报文的序号是10001。(因为客户端可能会发送多条连接请求,客户端需要知道服务端是对哪一条连接请求进行的回应)。同理,服务端也需要知道客户端期望的下一条报文的序号,因此,客户端还需要发送一条包含ack的报文,将这个期望值告诉服务端。
如果改成了两次,就会造成死锁。在第二条确认报文发送的过程中,如果发生了丢失,此时的客户端会一直等待自己的连接确认报文,而服务端已经确认建立了连接,开始发送数据。但是客户端还没有确认建立连接,就会忽略服务端的数据,而服务器端因为客户端一直没有接收数据,而不断地重复发送数据,从而造成死锁。

3. 如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP设有一个保活计时器。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

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

在这里插入图片描述

TIME_WAIT存在的原因有两点:①可靠地终止TCP连接。②保证让迟来的TCP报文段有足够的时间被识别并丢弃。
解释:一般是发起关闭连接的一端,会进入TIME_WAIT状态,这里我们假设TCP/A是客户端,TCP/B是服务端。当客户端发出了关闭连接请求后,接收到了服务端的确认接收关闭请求报文,此时的服务端在处理完所有数据后,会发送一条结束报文段,并且服务端希望接收该报文段的回应。如果不存在TIME_WAIT这一段时间,那么客户端就有可能接收不到这一报文,或者是客户端发送的确认结束报文在数据传输中丢失了,服务端会重新发送结束报文段(超时重传),客户端理应接收这一报文。因此它会存在一段TIME_WAIT的状态。
其次,在Linux系统上,一个TCP端口不能同时打开多次。当一个TCP连接处于TIME_WAIT的时候,我们将无法立即使用该连接占用的端口来建立一个新连接。 反过来思考,如果不存在TIME_WAIT状态,则应用程序能够立即建立一个相同IP、端口的TCP连接,并且可以接收到属于原来连接的、携带应用程序数据的TCP报文段,这显然是不应该发生的。
TIME_WAIT的长度为什么是2MSL因为TCP报文段的最大生存时间是MSL(Maximum Segment Life),所以坚持到2MSL时间的TIME_WAIT状态能够确保网络上两个传输方向尚未被接收到的、迟到的TCP报文段都已经消失(被中转路由器丢掉)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值