Trong giao thức UDP, một ổ cắm được xác định duy nhất bởi IP nguồn và cổng nguồn.
Trong giao thức TCP, ổ cắm được xác định duy nhất bởi IP nguồn, cổng nguồn, IP đích và cổng đích. Tại sao giao thức TCP yêu cầu thêm hai phần thông tin
NB cho thuật ngữ TCP, socket là cặp cổng địa chỉ; một cặp ổ cắm xác định kết nối . (Mỗi RFC 793 p5)
Tôi e rằng bạn đã nhầm về UDP, mặc dù nó không thực sự có "socket" - ngay cả khi thư viện Berkeley Sockets gọi chúng như vậy, và đó là một điều hợp lý để gọi một cặp cổng địa chỉ - ghép kênh về cơ bản là cách giống hệt với TCP.
Một tình huống điển hình mà bạn có thể thấy đây là trường hợp đồng thời nhiều độ phân giải DNS từ một máy chủ đến cùng một máy chủ DNS, trong đó rõ ràng chỉ có số cổng nguồn nhất thiết phải khác nhau. Bạn có thể thấy điều này hoàn toàn giống với nhiều kết nối TCP đồng thời từ một máy khách đến một máy chủ web.
UDP có datagram không kết nối. Máy chủ A gửi datagram ra khỏi cặp cổng địa chỉ, hướng vào cặp cổng địa chỉ tại B, thông thường, nhưng không phải lúc nào cũng trả lời theo cách phản chiếu. Nói một cách lỏng lẻo hơn về "giao tiếp", nó hoạt động chính xác hơn 4 tuple giống như kết nối TCP.
Đôi khi bạn sẽ thấy tham chiếu đến 5 tuple (Procotol, địa chỉ nguồn, cổng nguồn, địa chỉ đích, cổng đích), trong đó giao thức sẽ là 17 cho UDP, 6 cho TCP, v.v ... Đây là thứ mà hầu hết các tường lửa, bộ định tuyến, v.v. NAT và các hoạt động tương tự để xác định cặp giao tiếp này.
mặc dù máy chủ đã thiết lập một ổ cắm TCP dành riêng cho phiên đó trên một cổng khác
Tôi e rằng bạn cũng nhầm về TCP, có thể là do sự mâu thuẫn giữa thuật ngữ giữa định nghĩa của giao thức TCP (RFC 793) và triển khai thực tế phổ biến nhất của nó, Thư viện Sockets Berkeley, như được sử dụng trong Unix và mọi thứ bắt nguồn từ nó
Nếu bạn tập trung vào giao thức thì rõ ràng hơn nhiều: không có "cổng khác". Máy chủ web chỉ lắng nghe, ví dụ, 1.1.1.1 cổng 80. Máy khách chỉ gửi từ, để minh họa cho cổng 2.2.2.2 56789. Mỗi gói sẽ là 1.1.1.1:80 đến 2.2.2.2 giáp6789 hoặc ngược lại ; dễ dàng xác minh bằng cách xem các gói với tcpdump / wireshark / vv.
(Để giải thích ngắn gọn về việc triển khai Berkeley, một kết nối TCP được biểu thị bằng một số nguyên thông thường nhưng được gọi sockfd
một cách khó hiểu ; một ổ cắm TCP được đại diện bởi một struct sockaddr
. accept()
Hệ thống gọi rất khó hiểu về việc tạo ra một "ổ cắm được kết nối mới", theo nghĩa của nó kết nối mớicấu trúc ở trạng thái kết nối. Bộ dữ liệu của kết quả này sẽ nằm trong ví dụ của chúng tôi (1.1.1.1, 80, 2.2.2.2, 56789). Về UDP, thư viện cho phép bạn coi UDP là được kết nối, đây là cách thuận tiện nếu mô tả hoàn toàn trao đổi datagram UDP giữa hai quy trình và chỉ có nghĩa là cấu trúc ghi nhớ cặp cổng địa chỉ xa, theo thuật ngữ lập trình tạo ra UDP "kết nối" trông giống như một TCP. Hãy nhớ rằng thư viện Berkeley không chỉ dành cho IP và có sự khái quát hóa của một số hệ thống mạng cơ bản khác nhau. Nếu bạn muốn theo dõi các thuật ngữ lập trình mạng này, tôi đề xuất Stack Overflow, nơi có nhiều lập trình viên mạng rất có thẩm quyền.)