TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

Scroll Down

TCP的三次握手和四次挥手

image-20200710193600055

  • source port 源端口
  • destionation port 目的端口

注意: IP层只包含IP地址,端口是在传输层上的,IP+端口号可以唯一表识一个进程(套接字)

  • Sequence number 报文段的序号
  • Acknowledge Number 确认报文段
  • Offset 偏移
  • TCP Flags
  • widnow 滑动窗口 告知发送端 接收端的缓存大小从而控制发送端发送数据的速率从而达到流量控制
  • checksum 奇偶校验和 将TCP报文段的头部和数据进行16位的计算,并将结果保存在发送端并由接受端进行验证
  • Urgent Pointer 指出报文的紧急数据的字节数,URG置1
  • TCP Options 定义一些可选参数

TCP Flags

image-20200710194414469

image-20200710195154783

  • ESTAB-LISHED: 可以传输数据
  • SYN-SENT:建立连接

实战

  1. 首先找到http,tcp的握手就会出现在附近

image-20200710202329478

  1. ip.dst==115.28.159.6 or ip.src==15.28.159.6
  2. 具体的描述(以本地的应用程序的端口号51471为例,51471端口和服务器的80端口之间建立TCP连接)
  • 51470向80发送建立连接请求信号(SYN=1,seq=0)

image-20200710203357381

  • 80向51470应答连接请求信号(SYN=1,ACK=1,seq=0,ack=1)

image-20200710203452309

  • 51470向80发出确认信号(ACK=1,seq=1,ack=1),连接建立成功,接下来就可以传输数据了

image-20200710203508456

image-20200710204313349

问题

为什么需要三次握手才能建立连接:

为了初始化Sequence Number的值

SYN超时,SYN Flood风险!!!会耗尽SYN连接队列!!!

image-20200710204848138

image-20200710205001585

建立连接后client中断了,怎么办?

image-20200710205141183

TCP四次挥手

image-20200710205209472

实战

  • Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态

image-20200710223231952

  • Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态

image-20200710223256439

  • Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态

image-20200710223310109

  • Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,Server进入CLOSE状态,完成四次挥手

image-20200710223327278

超时设置

为什么会有TIME_WAIT状态?

image-20200710224400375

image-20200710224445299

image-20200710224607431

  • 查看CLOSE_WAIT的数量:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

image-20200710230752446

CLOSE_WAIT一旦太多就会爆出too many open files