文章目录
概述
TCP和UDP处于同一层——传输层,但是它们有很多的不同。TCP是TCP/IP系列协议中最复杂的部分,它具有以下特点:
- TCP提供可靠的数据传输服务,TCP是面向连接的。应用程序在使用TCP通信之前,先要建立连接,这是一个类似“打电话”的过程,通信结束后还要“挂电话”;
- TCP连接是点对点的,一条TCP连接只能连接两个端点;
- TCP提供可靠传输,无差错、不丢失、不重复、按顺序;
- TCP提供全双工通信,允许通信双方任何时候都能发送数据,因为TCP连接的两端都设有发送缓存和接收缓存;
- TCP面向字节流。TCP并不知道所传输的数据的含义,仅把数据看做一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。
下面使用netstat -s
查看数据报统计信息:
以下截取tcp部分
截图中各行所表示的含义依次是:主动开放的连接数;被动开放的连接数;失败的连接尝试;重置连接数;当前连接数;接收的分段数;发送的分段数;重新传输的分段数。
一、TCP报文段结构
TCP是面向字节流的,而TCP传输数据的单元是保温段。一个TCP报文段可分为两部分:报头和数据部分。数据部分是上层应用交付的数据,而报头则是TCP功能的关键。
TCP报文段的报头有前20字节是固定部分,后面4n字节是根据需要而添加的字段。如图是TCP报文段结构:
20字节的固定部分,各字段功能说明:
- 源端口和目的端口:各占2个字节,分别写入源端口好和目的端口号,这和UDO报头相似,因为都是传输层协议;
- 序号:占4个字节序,序号范围[0, 2^32-1],序号增加到2 ^32-1后,下个序号又回到0,TCP是面向字节流的,通过TCP传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号。
- 确认序号:占4个字节,期望收到对方下个报文段的第一个数据字节的序号;
- 数据偏移:占4位,指TCP报文段的报头长度,包括固定的20字节和选项字段;
- 保留:占6位,保留为今后使用,目前为0;
- 控制位:共有6个控制位,说明本报文的性质,意义如下:
(1) URG紧急:当URG=1时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用;
(2) ACK 确认:仅当ACK=1时确认号字段才有效。建立TCP连接后,所有报文段都必须把ACK字段置为1;
(3) PSH 推送:若TCP连接的一端希望另一端立即响应,PSH字段便可以“催促”对方,不在等到缓存区填满才发送;
(4) RST复位:若TCP连接出现严重差错,RST置为1,断开TCP连接,再重新建立连接;
(5) SYN 同步:用于建立和释放连接;
(6) FIN 终止:用于释放连接,当FIN = 1,表明发送方已经发送完毕,要求释放TCP连接。 - 窗口:占2个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限;
- 检验和:占2个字节。和UDP报文一样,有一个检验和,用于检查报文是否在传输过程中出差错;
- 紧急指针:占2个字节。当URG = 1时才有效,指出本报文段紧急数据的字节数;
- 选项:长度可选,最长可达40字节。
抓取命令
sudo tcpdump -ntx -c