← RFC Reference

RFC 2920 – SMTP Pipelining RFC 2920 – Đường ống SMTP

Internet Standard (STD 60) Core SMTP & Message Format Published March 2026
ELI5: SMTP thông thường giống như một cuộc trò chuyện mà bạn nói một câu, chờ người kia trả lời, rồi nói câu tiếp theo. Pipelining giống như nói liền tiếp nhiều câu một lúc và để người kia trả lời tất cả chúng cùng một lúc. Bạn không phải dừng lại giữa mỗi lệnh, vì vậy toàn bộ cuộc trò chuyện kết thúc nhanh hơn nhiều — đặc biệt là khi hai bên ở xa nhau.

Tại Sao RFC Này Tồn Tại

SMTP tiêu chuẩn là một giao thức yêu cầu-phản hồi nghiêm ngặt. Máy khách gửi một lệnh, chờ phản hồi của máy chủ, sau đó gửi lệnh tiếp theo. Mỗi vòng lặp đều tăng độ trễ, đặc biệt là qua các liên kết mạng có độ trễ cao. Đối với một tin nhắn có 50 người nhận, máy khách sẽ cần 50 vòng lặp riêng biệt chỉ để các lệnh RCPT TO.

RFC 2920 định nghĩa phần mở rộng SMTP PIPELINING, cho phép máy khách gửi nhiều lệnh cùng một lúc mà không cần chờ phản hồi từng cái. Máy chủ đệm và xử lý các lệnh theo thứ tự, sau đó gửi lại tất cả phản hồi. Điều này làm giảm đáng kể tổng thời gian cho một phiên SMTP.

Pipelining là một trong những phần mở rộng SMTP được hỗ trợ rộng rãi nhất. Hầu như mọi máy chủ thư hiện đại đều quảng cáo nó, và hầu hết thư viện máy khách SMTP sử dụng nó theo mặc định.

Cách Hoạt Động

  1. Máy khách gửi EHLO và xác nhận máy chủ quảng cáo PIPELINING trong danh sách khả năng.
  2. Máy khách nhóm các lệnh có thể pipeline một cách an toàn — thường là MAIL FROM, một hoặc nhiều RCPT TO, và DATA.
  3. Máy khách gửi tất cả các lệnh này liên tiếp mà không cần chờ phản hồi riêng lẻ.
  4. Máy chủ xử lý từng lệnh theo thứ tự và gửi lại một phản hồi cho mỗi lệnh, theo thứ tự.
  5. Máy khách đọc tất cả các phản hồi và xử lý bất kỳ lỗi nào (ví dụ: một người nhận bị từ chối).

Ví Dụ SMTP

Không có pipelining (5 vòng lặp cho bao thư):

C: MAIL FROM:<news@example.com> S: 250 2.1.0 OK C: RCPT TO:<alice@recipient.com> S: 250 2.1.5 OK C: RCPT TO:<bob@recipient.com> S: 250 2.1.5 OK C: RCPT TO:<carol@recipient.com> S: 550 5.1.1 User unknown C: DATA S: 354 Start mail input

Có pipelining (1 vòng lặp cho toàn bộ bao thư):

# Máy khách gửi tất cả các lệnh bao thư cùng một lúc C: MAIL FROM:<news@example.com> C: RCPT TO:<alice@recipient.com> C: RCPT TO:<bob@recipient.com> C: RCPT TO:<carol@recipient.com> C: DATA # Máy chủ phản hồi tất cả năm lệnh theo thứ tự S: 250 2.1.0 OK S: 250 2.1.5 OK S: 250 2.1.5 OK S: 550 5.1.1 User unknown S: 354 Start mail input # Máy khách gửi dữ liệu tin nhắn (carol bị từ chối, nhưng alice và bob tiếp tục) C: Subject: Weekly update C: C: This week's news... C: . S: 250 2.0.0 OK, queued

Chi Tiết Kỹ Thuật Chính

Lệnh Nào Có Thể Được Pipelined

Không phải tất cả các lệnh SMTP đều an toàn để pipeline. RFC 2920 chia các lệnh thành hai loại:

An Toàn Để Pipeline Phải Chờ Phản Hồi
MAIL FROM EHLO / HELO
RCPT TO STARTTLS
DATA AUTH
RSET QUIT
NOOP DATA content (the dot-stuffed body)

Các lệnh thay đổi trạng thái kết nối (EHLO, STARTTLS, AUTH) là những điểm đồng bộ hóa — máy khách phải chờ phản hồi trước khi gửi bất cứ thứ gì khác.

Xử Lý Lỗi

Khi pipelining, một số lệnh trong một nhóm có thể thành công trong khi những lệnh khác thất bại. Máy khách phải khớp phản hồi với các lệnh theo thứ tự. Một RCPT TO bị từ chối không làm vô hiệu hóa toàn bộ giao dịch — tin nhắn vẫn được gửi tới các người nhận được chấp nhận. Tuy nhiên, nếu MAIL FROM bị từ chối, các lệnh RCPT TO tiếp theo cũng sẽ thất bại.

Cân Nhắc Đệm TCP

Pipelining dựa vào đệm TCP. Máy khách ghi nhiều lệnh vào socket mà không cần đọc, tin tưởng rằng bộ đệm gửi TCP có thể chứa chúng. Đối với các nhóm RCPT TO rất lớn (hàng trăm hoặc hàng nghìn), máy khách có thể cần phải pipeline theo các nhóm để tránh lấp đầy bộ đệm TCP và bế tắc.

Tương Tác Với STARTTLS

Sau phản hồi EHLO bao gồm STARTTLS, máy khách phải không pipeline STARTTLS với các lệnh khác. Bắt tay TLS thay đổi trạng thái của toàn bộ kết nối, vì vậy nó là một điểm đồng bộ hóa cứng. Sau khi TLS được thiết lập và gửi EHLO mới, pipelining có thể tiếp tục.

Sai Lầm Phổ Biến

Tác Động Đến Khả Năng Gửi

Related RFCs