0%

TCP 可信传输协议

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
2
3
4
5
6
$ tcpdump -iany -nn tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
19:18:41.179701 IP 127.0.0.1.42524 > 127.0.0.1.80: Flags [S], seq 712584015, win 43690, options [mss 65495,sackOK,TS val 4236991780 ecr 0,nop,wscale 7], length 0
14:59:13.050531 IP 127.0.0.1.80 > 127.0.0.1.42524: Flags [S.], seq 2917476214, ack 712584016, win 43690, options [mss 65495,sackOK,TS val 4236991780 ecr 4236991780,nop,wscale 7], length 0
19:18:41.179727 IP 127.0.0.1.42524 > 127.0.0.1.80: Flags [.], ack 1, win 342, options [nop,nop,TS val 4236991780 ecr 4236991780], length 0

-nn: 表示不解析域名,直接显示IP,在netstat命令中,也有这个选项
-i: 指定监听的网卡,如果为 -iany 则表示监听所有的网卡

TCP 特点

首先,TCP 是基于连接的,也就是在进行数据传输之前,客户端与服务端(或者说是通信的双方)需要先建立一个可信的连接。在数据传输结束后,再通过一种协定的方式断开连接,由通信的双方释放资源。这里涉及到的,就是常说的”三次握手”、”四次挥手”

其次,TCP 是可靠的,它定义了一种数据包的”超时重传机制”,简单说,就是每一个数据包在发送出去后的都会等待一个响应。如果指定时间内没有收到响应,由发送方进行一定次数的重传来保证数据的可靠传输。

最后,TCP 是基于流的,这是指在传输数据时应用层不需要关注数据包的边界,TCP在数据传输时会自动根据网络环境将数据进行缓冲、分组、合并。这点跟基于报文的协议(UDP)是截然不同的。当然,基于流的传输也保证了数据收发的有序性,因此每个数据包都附带上一个属于当前连接的序列号。

TCP 与 UDP 区别

TCP UDP
面向连接 无连接
提供可靠服务 不保证可靠
点到点 一对一,一对多,多对一和多对多
对系统资源要求较多 对系统资源要求较少
实时性低 实时性高
流模式 数据报模式,基于报文的

参考链接