S là một chương trình máy chủ: giả sử đó là máy chủ HTTP, vì vậy nó sẽ sử dụng số cổng nổi tiếng cho HTTP , là 80. Tôi chạy nó trên một máy chủ có địa chỉ IP 10.0.0.4
, vì vậy nó sẽ lắng nghe các kết nối 10.0.0.4:80
(vì đó là nơi mọi người sẽ mong đợi để tìm thấy nó).
Bên trong S , tôi sẽ tạo một ổ cắm và liên kết nó với địa chỉ đó: bây giờ, HĐH biết rằng các kết nối đến 10.0.0.4:80
sẽ được chuyển đến quy trình S của tôi thông qua ổ cắm cụ thể đó.
đầu ra netstat một khi ổ cắm bị ràng buộc:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
Lưu ý địa chỉ cục bộ là tất cả các số 0 vì S không quan tâm đến cách khách hàng tiếp cận nó
Khi S đã ổ cắm này bị ràng buộc, nó sẽ chấp nhận các kết nối - mỗi lần một khách hàng mới kết nối, accept
trả về một mới ổ cắm, đó là cụ thể cho khách hàng
đầu ra netstat sau khi kết nối được chấp nhận:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.4:80 10.0.0.5:55715 ESTABLISHED
10.0.0.4:80
đại diện cho kết thúc của S của kết nối và được liên kết với ổ cắm được trả về bởiaccept
10.0.0.5:55715
là kết thúc của máy khách và được liên kết với ổ cắm mà máy khách được truyền để kết nối . Cổng của khách hàng không được sử dụng cho bất cứ điều gì ngoại trừ các gói định tuyến trên kết nối TCP này theo đúng quy trình: nó được gán ngẫu nhiên bởi nhân của máy khách từ phạm vi cổng phù du.
Bây giờ, S có thể vui vẻ tiếp tục chấp nhận nhiều kết nối máy khách hơn ... mỗi người sẽ có một ổ cắm riêng, mỗi ổ cắm sẽ được liên kết với một kết nối TCP duy nhất và mỗi kết nối sẽ có một địa chỉ từ xa duy nhất. S sẽ theo dõi trạng thái máy khách (nếu có) bằng cách liên kết nó với ổ cắm.
Vì vậy, đại khái:
- địa chỉ IP dùng để định tuyến giữa các máy chủ trên mạng
- cổng để định tuyến đến đúng ổ cắm trên máy chủ
- Tôi gần như đã nói đúng quy trình , nhưng thực sự có thể có nhiều quy trình (thường là con) tất cả chấp nhận trên cùng một ổ cắm ...
- tuy nhiên, mỗi khi một trong các
accept
cuộc gọi đồng thời trả về, nó chỉ thực hiện trong một quy trình, mỗi ổ cắm của kết nối đến là duy nhất cho một phiên bản của máy chủ
- ổ cắm là đối tượng mà một quá trình sử dụng để nói chuyện với HĐH về một kết nối cụ thể, giống như một bộ mô tả tệp
- như đã đề cập trong các bình luận, có rất nhiều cách sử dụng khác cho các socket không sử dụng cổng nào cả: ví dụ, socket socket tạo ra một cặp socket được kết nối với nhau mà không có sơ đồ địa chỉ nào cả quá trình được gọi
socketpair
là con của quá trình đó và kế thừa một hoặc được thông qua một trong các ổ cắm từ quy trình đó