TCP 是基于全双工的可信传输协议
前言
TCP 状态
了解 TCP 各个状态,对理解知识和定位问题有很大帮助,具体参看TCP连接的状态详解以及故障排查(上),下方列出会用到的状态
LISTENING: 表示侦听来自远方的TCP端口的连接请求
SYN-SENT: 客户端 SYN_SENT 状态
SYN-RECEIVED: 服务器端状态 SYN_RCVD
ESTABLISHED: 代表一个打开的连接
FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2: 从远程TCP等待连接中断请求
CLOSE-WAIT: 等待从本地用户发来的连接中断请求
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED: 没有任何连接状态
三次握手、四次挥手
具体可以参看跟着动画学习TCP三次握手和四次挥手,动画做的挺好的,也讲的挺通俗易懂的。
可以使用tcpdump
命令来抓包
1 | $ tcpdump -iany -nn tcp port 80 |
-nn: 表示不解析域名,直接显示IP,在netstat命令中,也有这个选项
-i: 指定监听的网卡,如果为 -iany 则表示监听所有的网卡
TCP 特点
首先,TCP 是基于连接的,也就是在进行数据传输之前,客户端与服务端(或者说是通信的双方)需要先建立一个可信的连接。在数据传输结束后,再通过一种协定的方式断开连接,由通信的双方释放资源。这里涉及到的,就是常说的”三次握手”、”四次挥手”
其次,TCP 是可靠的,它定义了一种数据包的”超时重传机制”,简单说,就是每一个数据包在发送出去后的都会等待一个响应。如果指定时间内没有收到响应,由发送方进行一定次数的重传来保证数据的可靠传输。
最后,TCP 是基于流的,这是指在传输数据时应用层不需要关注数据包的边界,TCP在数据传输时会自动根据网络环境将数据进行缓冲、分组、合并。这点跟基于报文的协议(UDP)是截然不同的。当然,基于流的传输也保证了数据收发的有序性,因此每个数据包都附带上一个属于当前连接的序列号。
TCP 与 UDP 区别
TCP | UDP |
---|---|
面向连接 | 无连接 |
提供可靠服务 | 不保证可靠 |
点到点 | 一对一,一对多,多对一和多对多 |
对系统资源要求较多 | 对系统资源要求较少 |
实时性低 | 实时性高 |
流模式 | 数据报模式,基于报文的 |
参考链接