TCP 基础

目录

什么是TCP

特点

包头

Sequence Number :

Acknowledgment Number :

Flages :状态位(常用举例)

Window

TCP Options

时间戳RTT:

小知识

TCP的链接

TCP三次握手

三次握手主要目的

TCP四次挥手

Linux状态机

常用命令

TCP连接状态详解


什么是TCP

TCP通过在发送端和接收端之间建立虚拟的连接来实现可靠的数据传输。它使用序号和确认机制来确保数据的可靠性和顺序性。

特点

  1. 可靠性:

TCP通过序号和确认机制来确保数据的可靠传输,保证数据不丢失、不重复,并按正确的顺序传输。

  1. 面向连接:

传输前TCP会在发送端和接收端之间建立一个虚拟的连接,数据传输完成后再断开连接。

  1. 流量控制:

TCP使用流量控制机制来限制发送端发送数据的速率,以避免接收端无法及时处理数据。

  1. 拥塞控制:

TCP使用拥塞控制机制来监测网络的拥塞程度,并调整发送速率以避免网络拥塞。

  1. 支持面向字节的数据流:

TCP将数据分割成小的数据段,以字节为单位进行传输。

包头

Sequence Number :

Seq序号,为了提供有序的传输,在TCP连接中所传送的字节流的每一个字节都会按顺序编号。

seq如何编号

  • 数据段1的起始seq号为1,长度为1208(意味着它包含了1208个字符)那么数据段2的seq号就是1+1208=1209,数据段2的长度是1380,所以数据包3的seq为2589
  • 由于TCP是双向的,所以各自维护了一个seq号(图中出现的seq:882)

Acknowledgment Number :

Ack序号,确认已收到的数据(即ACK=对方上一个数据包的seq+数据包内tcp封装的字节数TCP segment len),也是期望对方下次发送的数据的第一个字节数据的编号。

Flages :状态位(常用举例)

  • SYN 发起一个链接
  • ACK 回复确认已收到的数据
  • RST 重新链接:重置一个混乱的链接,或者拒绝一个无效的请求(意味着有问题)
  • FIN 结束链接

Window

窗口大小,TCP做流控,双方各维护个人的窗口,表面自己当前还能处理的数据大小

TCP Options

  • MSS(最长报文长度):TCP报文段的最大长度即MSS值,仅指明TCP数据部分的长度,不包括IP包头,和TCP头部,通常在本方发出SYN位置 1 时含有该项
  • Windows Scale(窗口扩张):定义一个作用窗口大小字节的扩展因子,能大幅提高窗口大小字段容量。只能在SYN至1的报文中出现,出现后后续的窗口大小都会乘以Windows Scale即2的n次方,n即是Windows Scale的置位

(由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535,无法满足更大窗口来表示吞吐性能)

  • SACK-Permitted :选择性确认支持,用来表示TCP报文的发送方是否支持SACK功能,仅在三次握手的前两个包中出现
  • SACK :接收方每当缓存中存在失序数据时,接收端就可生成SACK。发送方收到这份SACK时会根据收到的SACK选择性重传,使的一个RTT内能获取多个需要处理(重传)的数据包信息。

时间戳RTT:

供发送方根据接收方回复的报文测量TCP链接的RTT。

计算步骤

  1. 发送方发送数据时,将一个timestamp(发送时间)放入包内
  2. 接收方收到数据后,对应的ACK包中将收到timestamp返回给发送方
  3. 发送方收到对方的ACK后,用当前时间 - ACK中的timestamp能够准确得到RTT

小知识

  • TCP 吞吐量随着 RTT 的增加而降低(因为窗口大小固定,RTT越短发送数据越多)
  • UDP 吞吐量不受RTT影响

TCP的链接

TCP三次握手

TCP三次握手示意图

通常称为:请求→ 应答 → 应答之应答

  1. TCP客户端发出SYN标记位置 1 ,以请求建立TCP链接,

指明本方TCP初始序列号

指明本方窗口大小,即客户端分配给TCP进程的缓存大小(内存空间)

TCP头部选项会携带某些信息(MSS 或 选择性确认)

  1. 收到TCP链接请求后,服务器会回复TCP确认报文

SYN ACK 标记位同时置 1

指明本方TCP初始序列号

指明本方窗口大小,即服务器分配给TCP进程的缓存大小(内存空间)

根据对方TCP携带的选项,设置自己TCP头部的各个选项

  1. 收到服务发来的SYN ACK 标记位同时置 1的报文后,TCP客户端会进行确认回复

将ACK 标记位置 1,继续维护窗口

三次握手主要目的

  1. 建立链接
  2. 获悉对方初始序列号
  3. 得知对方可用来接收数据的缓存容量

TCP四次挥手

TCP四次挥手示意图

linux系统可以通过tcp_fin_timeout设置一个超时时间

Linux默认的TIME_WAIT时长一般是60秒(等于2MSL)

Linux没有提供修改TIME_WAIT时长接口,除非修改宏的定义重新编译内核

  1. TCP客户端发出FIN标记位置 1 ,以请求断开TCP链接
  2. 收到TCP断开请求后,服务器会回复TCP确认报文,并继续处理未传输完成的客户端请求数据
  3. 服务器处理完全部请求的数据后,也开始发送断开链接,FIN标记置 1, ACK确认报文数同步骤2相等
  4. 收到服务发来的FIN 标记位置 1的报文后,TCP客户端会进行确认回复

Linux状态机

常用命令

netstat -na 通过IP形式查看所有socket链接,其中 ”state “ 项便是状态

netstat -nat 可以查看TCP链接

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

netstat -nat|grep -i "80" 查看使用 80 端口的链接

netstat -ant | grep tcp | grep 80 | awk '{print $6}'| sort | uniq -c | sort -rn 查看80端口的tcp链接状态,(80可以更改为服务端口)

netstat -anlp|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n5 查看ESTABLISHED状态的前5ip

Cat /proc/net/nf_conntrack 服务器所有链接细节(方便排查服务访问情况)

Conntrack -L 跟踪iptables表中的链接

TCP连接状态详解

  • LISTEN: 侦听来自远方的TCP端口的连接请求
  • SYN-SENT: 再发送连接请求后等待匹配的连接请求
  • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
  • ESTABLISHED: 代表一个打开的连接
  • FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
  • FIN-WAIT-2: 从远程TCP等待连接中断请求
  • CLOSE-WAIT: 等待从本地用户发来的连接中断请求
  • CLOSING: 等待远程TCP对连接中断的确认
  • LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
  • TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
  • CLOSED: 没有任何连接状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值