说说 TCP 协议以及三次握手流程
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
1 表头内容
TCP 包主要包含以下表头内容:
内容 | 说明 |
---|---|
Source Port | 來源埠口 |
Destination Port | 目標埠口。主机会利用来源埠口与目標埠口所建立的 『 通道 』 来传送 TCP 包。 |
Sequence Number | 包序号,用于记录每个包的序号。如果 TCP 数据太大时 ( 比如大于 IP 包所容许的程度 ) ,就必须进行分段。这样可以让接收端把收到的包,依据序号,重新组装起来。 |
Acknowledge Number | 回应序号。用于确认目标端确实有收到来源端所送出的 TCP 包。 |
Control Flag | 控制标志码。这个码有6个 bits ,分别代表6个控制码。 |
控制标志码 | 说明 |
---|---|
URG(Urgent) | 为1则代表该包为紧急包,接收端需要紧急处理。 |
ACK(Acknowledge) | 为1代表这个包为回应包,即与 Acknowledge Number 相关。 |
PSH(Push function) | 为1代表要求对方立即传送缓冲区内的包,默认是等待缓冲区满了之后才会传送。 |
RST(Reset) | 为1表示连线会被马上结束,而默认是会等待终止确认步骤。 |
SYN(Synchronous) | 为1表示发送端希望双方建立连线。通常带有 SYN 标志的包表示 『 主动 』 要求连接到对端。 |
FIN(Finish) | 为1表示传送结束,即通知对方数据传送结束,并等待对方回应。 |
2 埠口
除了上述内容,TCP 表头还包含埠口。 它有 16 位,因此目标与来源埠口最大可为 65535 号 (2 的 16 次方 ) !
不同的服务所对应的埠口号也不同,具体写在 /etc/services 中:
更详细的内容,在 https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml 中。
常见的埠口有这些:
埠口 | 说明 |
---|---|
20 | FTP-data ,文件传输协议所使用的数据传输通道。 |
21 | FTP ,文件传输协议的命令通道。 |
22 | SSH ,较为安全的服务通道。 |
23 | Telnet ,远程登陆服务。 |
25 | SMTP ,简单邮件传输协议,作为邮件服务器的通道。 |
53 | DNS ,作为域名解析服务器的通道。 |
80 | 最基本的 WWW 服务通道,为默认埠口。 |
110 | POP3 ,邮件收信协议。 |
443 | https ,带安全加密机制的 WWW 服务通道。 |
这些埠口号通常小于 1024 ,用于供给知名的网络服务软件使用。
因为指定好埠口,才能真正确定网络地址,所以 IP 与埠口常常连在一起说明,即『 IP :port』,因此又称之为 Socket Pair。
3 三次握手
TCP 包在建立连线之前,都必须要通过三个确认动作,所以这种连线方式也就被称为三次握手 (Three-wayhandshake)。 整个流程可以以 A , B , C , D 四个阶段来说明:
阶段 A:
当客户端想要与目的端建立连接时,首先要发送一个要求连线的包,此时客户端会随机取用一个大于 1024 以上的埠口来做为来源埠口。然后在 TCP 的表头中,带有 SYN 的主动连线标识( SYN =1),并且记下发送包序号 (Sequence number=10001)。
阶段 B:
当目的端收到这个包时,会开始制作一个带有 SYN=1 , ACK=1 的包,并带有 acknowledge ,它给客户端确认之用(所以该数字比收到的 seq 多 1)。因为目的端也需要确认客户端可以接收目的端所发送的包,所以也会发送出一个 Sequence (seq=20001 ) 给客户端,并等待客户端响应。
阶段 C:
当客户端收到来自服务器端的带 ACK=10002 的包之后,就能够确认之前所发送的请求包已经被正确接收咯。接下来,如果客户端也同意与目的端的连线请求,那么就会再次发送一个确认包( ACK =1,acknowledge=20001+1=20002)给目的端。
阶段 D:
在目的端收到带有 ACK=1 且 ack=20002 序号的包之后,就能够正式建立连接通道咯。