Đây là một câu hỏi được đặt ra bởi một trong những kỹ sư phần mềm trong tổ chức của tôi. Tôi quan tâm đến định nghĩa rộng nhất.
Đây là một câu hỏi được đặt ra bởi một trong những kỹ sư phần mềm trong tổ chức của tôi. Tôi quan tâm đến định nghĩa rộng nhất.
Câu trả lời:
Một TCP socket là một endpoint dụ xác định bởi một địa chỉ IP và một cổng trong bối cảnh của một trong hai kết nối TCP cụ thể hoặc tình trạng nghe.
Một cổng là một định danh ảo xác định một điểm cuối dịch vụ (như phân biệt với một dịch vụ dụ endpoint aka định danh session).
Ổ cắm TCP không phải là kết nối , nó là điểm cuối của một kết nối cụ thể.
Có thể có các kết nối đồng thời đến điểm cuối dịch vụ , bởi vì kết nối được xác định bởi cả điểm cuối cục bộ và điểm cuối từ xa , cho phép lưu lượng truy cập được chuyển đến một phiên bản dịch vụ cụ thể.
Chỉ có thể có một ổ cắm nghe cho một kết hợp địa chỉ / cổng nhất định .
Đây là một câu hỏi thú vị buộc tôi phải kiểm tra lại một số điều mà tôi nghĩ rằng tôi biết từ trong ra ngoài. Bạn sẽ nghĩ một cái tên như "ổ cắm" sẽ tự giải thích: rõ ràng nó được chọn để gợi lên hình ảnh của điểm cuối mà bạn cắm cáp mạng, có sự tương đồng về chức năng mạnh mẽ. Tuy nhiên, theo cách nói của mạng, từ "ổ cắm" mang theo rất nhiều hành lý đến mức cần phải kiểm tra lại cẩn thận.
Theo nghĩa rộng nhất có thể, một cổng là một điểm xâm nhập hoặc đi ra. Mặc dù không được sử dụng trong ngữ cảnh mạng, từ tiếng Pháp porte có nghĩa đen là cửa hoặc cổng , nhấn mạnh thêm thực tế rằng các cổng là điểm cuối giao thông cho dù bạn gửi dữ liệu hoặc thùng thép lớn.
Với mục đích của cuộc thảo luận này, tôi sẽ giới hạn xem xét đối với bối cảnh của các mạng TCP-IP. Mô hình OSI rất tốt nhưng chưa bao giờ được thực hiện hoàn toàn, ít được triển khai rộng rãi trong điều kiện căng thẳng cao lưu lượng truy cập cao.
Sự kết hợp giữa địa chỉ IP và cổng được gọi đúng là điểm cuối và đôi khi được gọi là ổ cắm. Việc sử dụng này bắt nguồn từ RFC793, đặc tả TCP gốc.
Một kết nối TCP được xác định bởi hai điểm cuối aka socket .
Một điểm cuối (ổ cắm) được xác định bởi sự kết hợp của địa chỉ mạng và mã định danh cổng . Lưu ý rằng địa chỉ / cổng không hoàn toàn xác định một ổ cắm (nhiều hơn về điều này sau).
Mục đích của các cổng là phân biệt nhiều điểm cuối trên một địa chỉ mạng nhất định. Bạn có thể nói rằng một cổng là một điểm cuối ảo hóa. Ảo hóa này làm cho nhiều kết nối đồng thời trên một giao diện mạng có thể.
Đó là cặp ổ cắm (4 tuple bao gồm địa chỉ IP của máy khách, số cổng máy khách, địa chỉ IP của máy chủ và số cổng máy chủ) chỉ định hai điểm cuối xác định duy nhất mỗi kết nối TCP trên internet. ( TCP-IP Illustrated Tập 1 , W. Richard Stevens)
Trong hầu hết các ngôn ngữ có nguồn gốc C, các kết nối TCP được thiết lập và thao tác bằng các phương thức trên một thể hiện của lớp Socket. Mặc dù thông thường hoạt động ở mức độ trừu tượng cao hơn, điển hình là một thể hiện của lớp NetworkStream, nhưng điều này thường phơi bày một tham chiếu đến một đối tượng socket. Đối với bộ mã hóa, đối tượng socket này xuất hiện để thể hiện kết nối vì kết nối được tạo và thao tác bằng các phương thức của đối tượng socket.
Trong C #, để thiết lập kết nối TCP (với trình nghe hiện có) trước tiên bạn tạo TcpClient . Nếu bạn không chỉ định điểm cuối cho hàm tạo TcpClient, nó sẽ sử dụng mặc định - bằng cách này hay cách khác, điểm cuối cục bộ được xác định. Sau đó, bạn gọi phương thức Connect trong trường hợp bạn đã tạo. Phương pháp này yêu cầu một tham số mô tả điểm cuối khác.
Tất cả điều này là một chút khó hiểu và khiến bạn tin rằng một ổ cắm là một kết nối, đó là bollocks. Tôi đã lao động dưới sự hiểu lầm này cho đến khi Richard Dorman đặt câu hỏi.
Đã đọc và suy nghĩ rất nhiều, giờ đây tôi tin chắc rằng sẽ có ý nghĩa hơn khi có một lớp TcpConnection với một hàm tạo có hai đối số là LocalEndpoint và RemoteEndpoint . Bạn có thể có thể hỗ trợ một đối số RemoteEndpoint khi mặc định được chấp nhận cho điểm cuối cục bộ. Điều này không rõ ràng trên các máy tính đa biến, nhưng sự mơ hồ có thể được giải quyết bằng bảng định tuyến bằng cách chọn giao diện có tuyến đường ngắn nhất đến điểm cuối từ xa.
Sự rõ ràng cũng sẽ được tăng cường trong các khía cạnh khác. Một ổ cắm không được xác định bởi sự kết hợp của địa chỉ IP và cổng:
[...] TCP phân tách các phân đoạn đến bằng cách sử dụng cả bốn giá trị bao gồm địa chỉ cục bộ và địa chỉ nước ngoài: địa chỉ IP đích, số cổng đích, địa chỉ IP nguồn và số cổng nguồn. TCP không thể xác định quá trình nào có được một phân đoạn đến bằng cách chỉ nhìn vào cổng đích. Ngoài ra, một trong những điểm cuối [khác nhau] tại [một số cổng nhất định] sẽ nhận được yêu cầu kết nối đến là điểm cuối trong trạng thái nghe. (p255, TCP-IP Minh họa Tập 1 , W. Richard Stevens)
Như bạn có thể thấy, không chỉ có khả năng mà rất có khả năng một dịch vụ mạng có nhiều ổ cắm có cùng địa chỉ / cổng, mà chỉ có một ổ cắm nghe trên một kết hợp địa chỉ / cổng cụ thể. Các triển khai thư viện điển hình trình bày một lớp socket, một thể hiện được sử dụng để tạo và quản lý một kết nối. Điều này là vô cùng đáng tiếc, vì nó gây ra sự nhầm lẫn và dẫn đến sự kết hợp rộng rãi của hai khái niệm này.
Hagrawal không tin tôi (xem bình luận) vì vậy đây là một mẫu thực sự. Tôi đã kết nối một trình duyệt web với http://dilbert.com và sau đó chạy netstat -an -p tcp
. Sáu dòng cuối cùng của đầu ra chứa hai ví dụ về thực tế là địa chỉ và cổng không đủ để xác định duy nhất một ổ cắm. Có hai kết nối riêng biệt giữa 192.168.1.3 (máy trạm của tôi) và 54.252.94.236:80 (máy chủ HTTP từ xa)
TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED
Vì một ổ cắm là điểm cuối của một kết nối, có hai ổ cắm với sự kết hợp địa chỉ / cổng 207.38.110.62:80
và hai ổ cắm khác với sự kết hợp địa chỉ / cổng 54.252.94.236:80
.
Tôi nghĩ rằng sự hiểu lầm của Hagrawal phát sinh từ việc tôi sử dụng từ "nhận dạng" rất cẩn thận. Tôi có nghĩa là "hoàn toàn, rõ ràng và xác định duy nhất". Trong mẫu trên có hai điểm cuối với sự kết hợp địa chỉ / cổng54.252.94.236:80
. Nếu tất cả những gì bạn có là địa chỉ và cổng, bạn không có đủ thông tin để phân biệt các ổ cắm này. Nó không đủ thông tin để xác định một ổ cắm.
Đoạn hai của phần 2.7 của RFC793 nói
Một kết nối được chỉ định đầy đủ bởi cặp ổ cắm ở cuối. Một ổ cắm cục bộ có thể tham gia vào nhiều kết nối với các ổ cắm nước ngoài khác nhau.
Định nghĩa về socket này không hữu ích từ góc độ lập trình vì nó không giống với đối tượng socket , là điểm cuối của một kết nối cụ thể. Đối với một lập trình viên, và hầu hết khán giả của câu hỏi này là lập trình viên, đây là một sự khác biệt quan trọng về chức năng.
Một ổ cắm bao gồm ba điều:
Một cổng là một số từ 1 đến 65535, bao gồm một cổng logic trong thiết bị. Mỗi kết nối giữa máy khách và máy chủ yêu cầu một ổ cắm duy nhất.
Ví dụ:
Một ổ cắm đại diện cho một kết nối duy nhất giữa hai ứng dụng mạng. Hai ứng dụng này thường chạy trên các máy tính khác nhau, nhưng ổ cắm cũng có thể được sử dụng để liên lạc giữa các máy tính trên một máy tính. Các ứng dụng có thể tạo ra nhiều ổ cắm để giao tiếp với nhau. Các ổ cắm là hai chiều, có nghĩa là một trong hai bên của kết nối có khả năng gửi và nhận dữ liệu. Do đó, một ổ cắm có thể được tạo ra trên lý thuyết ở bất kỳ cấp độ nào của mô hình OSI từ 2 trở lên. Các lập trình viên thường sử dụng các socket trong lập trình mạng, mặc dù gián tiếp. Các thư viện lập trình như Winsock ẩn nhiều chi tiết cấp thấp của lập trình socket. Ổ cắm đã được sử dụng rộng rãi từ đầu những năm 1980.
Một cổng đại diện cho một điểm cuối hoặc "kênh" cho truyền thông mạng. Số cổng cho phép các ứng dụng khác nhau trên cùng một máy tính sử dụng tài nguyên mạng mà không can thiệp lẫn nhau. Số cổng thường xuất hiện nhất trong lập trình mạng, đặc biệt là lập trình socket. Đôi khi, mặc dù, số cổng được hiển thị cho người dùng thông thường. Ví dụ: một số trang web mà một người truy cập trên Internet sử dụng URL như sau:
http://www.mairie-metz.fr:8080/ Trong ví dụ này, số 8080 đề cập đến số cổng được sử dụng bởi trình duyệt Web để kết nối với máy chủ Web. Thông thường, một trang web sử dụng cổng số 80 và số này không cần phải được bao gồm trong URL (mặc dù có thể như vậy).
Trong mạng IP, số cổng theo lý thuyết có thể nằm trong khoảng từ 0 đến 65535. Tuy nhiên, hầu hết các ứng dụng mạng phổ biến đều sử dụng số cổng ở đầu thấp của phạm vi (chẳng hạn như 80 cho HTTP).
Lưu ý: Thuật ngữ cổng cũng đề cập đến một số khía cạnh khác của công nghệ mạng. Một cổng có thể đề cập đến một điểm kết nối vật lý cho các thiết bị ngoại vi như cổng nối tiếp, song song và USB. Cổng hạn cũng đề cập đến một số điểm kết nối Ethernet nhất định, chẳng hạn như các điểm trên hub, bộ chuyển mạch hoặc bộ định tuyến.
ref http://compnetworking.about.com/od/basicnetworkingcon accept / l / bldef_port.htmlm
ref http://compnetworking.about.com/od/itinformationt Technology / l / bldef_socket.htmlm
Với một số tương tự
Mặc dù nhiều công cụ kỹ thuật đã được đưa ra ở trên cho ổ cắm ... Tôi muốn thêm câu trả lời của mình, chỉ trong trường hợp, nếu ai đó vẫn không thể cảm thấy sự khác biệt giữa ip, cổng và ổ cắm
Hãy xem xét một máy chủ S ,
và nói người X, Y, Z cần một dịch vụ (nói dịch vụ trò chuyện) từ máy chủ S đó
sau đó
Địa chỉ IP cho biết -> ai? là máy chủ trò chuyện 'S' mà X, Y, Z muốn liên hệ
được rồi, bạn có "máy chủ" là ai
nhưng giả sử rằng máy chủ 'S' cũng đang cung cấp một số dịch vụ khác cho người khác, giả sử 'S' cung cấp dịch vụ lưu trữ cho người A, B, C
sau đó
cảng nói ---> cái nào? dịch vụ bạn (X, Y, Z) cần dịch vụ trò chuyện chứ không phải dịch vụ lưu trữ
được rồi .., bạn làm cho máy chủ biết rằng 'dịch vụ trò chuyện' là thứ bạn muốn chứ không phải là bộ lưu trữ
nhưng
bạn là ba và máy chủ có thể muốn xác định cả ba cách khác nhau
có ổ cắm
Bây giờ socket nói -> cái nào?kết nối cụ thể
đó là nói
ổ cắm 1 cho người X
ổ cắm 2 cho người Y
và ổ cắm 3 cho người Z
Tôi hy vọng nó sẽ giúp được ai đó vẫn còn bối rối :)
Đầu tiên, tôi nghĩ chúng ta nên bắt đầu với một chút hiểu biết về những gì cấu thành nên việc nhận một gói từ A đến B.
Một định nghĩa chung cho một mạng là việc sử dụng Mô hình OSI để phân tách một mạng thành một số lớp theo mục đích. Có một vài điều quan trọng, chúng tôi sẽ đề cập ở đây:
TCP chứa, trong số những thứ khác, khái niệm về cổng . Đây là các điểm cuối dữ liệu khác nhau có hiệu quả trên cùng một địa chỉ IP mà Internet Socket ( AF_INET
) có thể liên kết.
Khi nó xảy ra, UDP cũng vậy và các giao thức lớp vận chuyển khác. Về mặt kỹ thuật, chúng không cần phải có các cổng, nhưng các cổng này cung cấp một cách để nhiều ứng dụng trong các lớp ở trên sử dụng cùng một máy tính để nhận (và thực sự tạo ra) các kết nối đi.
Điều này đưa chúng ta đến giải phẫu của kết nối TCP hoặc UDP. Mỗi tính năng một cổng nguồn và địa chỉ, và một cổng đích và địa chỉ. Điều này là để trong bất kỳ phiên nào, ứng dụng đích có thể phản hồi, cũng như nhận được từ nguồn.
Vì vậy, các cổng về cơ bản là một cách bắt buộc đặc tả cho phép nhiều kết nối đồng thời chia sẻ cùng một địa chỉ.
Bây giờ, chúng ta cần xem xét cách bạn giao tiếp từ quan điểm ứng dụng với thế giới bên ngoài. Để làm điều này, bạn cần vui lòng hỏi hệ điều hành của mình và vì hầu hết các hệ điều hành đều hỗ trợ cách thức hoạt động của Berkeley Sockets, chúng tôi thấy chúng tôi có thể tạo ra các ổ cắm liên quan đến các cổng từ một ứng dụng như thế này:
int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
Tuyệt quá! Vì vậy, trong các sockaddr
cấu trúc, chúng tôi sẽ chỉ định cổng và bam của chúng tôi! Công việc hoàn thành! Chà, gần như, ngoại trừ:
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
cũng có thể Urgh, đó là một cờ lê trong công trình!
Ok, thực sự thì không. Tất cả những gì chúng ta cần làm là đưa ra một số định nghĩa phù hợp:
/var/run/database.sock
.Voila! Điều đó dọn dẹp mọi thứ lên. Vì vậy, trong kế hoạch của chúng tôi sau đó,
Vì vậy, thực sự một cổng là một tập hợp con của các yêu cầu để hình thành một ổ cắm internet. Thật không may, nó chỉ xảy ra rằng ý nghĩa của ổ cắm từ đã được áp dụng cho một số ý tưởng khác nhau. Vì vậy, tôi chân thành khuyên bạn nên đặt tên cho ổ cắm dự án tiếp theo của bạn, chỉ để thêm vào sự nhầm lẫn;)
Ổ cắm = Địa chỉ IP + một cổng (địa chỉ số)
Cùng nhau họ xác định điểm cuối cho kết nối mạng trên máy. (Có phải tôi vừa làm hỏng mạng 101 không?)
Nói chung, bạn sẽ nhận được rất nhiều lý thuyết nhưng một trong những cách dễ nhất để phân biệt hai khái niệm này là như sau:
Để có được một dịch vụ, bạn cần một số dịch vụ. Số dịch vụ này được gọi là một cổng. Đơn giản như thế.
Ví dụ: HTTP là một dịch vụ đang chạy trên cổng 80.
Bây giờ, nhiều người có thể yêu cầu dịch vụ và kết nối từ máy khách-máy chủ đã được thiết lập. Sẽ có rất nhiều kết nối. Mỗi kết nối đại diện cho một khách hàng. Để duy trì mỗi kết nối, máy chủ tạo một ổ cắm cho mỗi kết nối để duy trì máy khách của nó.
Dường như có rất nhiều câu trả lời tương đương ổ cắm với kết nối giữa 2 PC..những gì tôi nghĩ là hoàn toàn không chính xác. Một ổ cắm luôn là điểm cuối trên 1 PC, có thể có hoặc không được kết nối - chắc chắn tất cả chúng ta đều đã sử dụng ổ cắm nghe hoặc UDP * tại một số điểm. Phần quan trọng là địa chỉ và hoạt động. Gửi tin nhắn đến 1.1.1.1:1234 không có khả năng hoạt động, vì không có ổ cắm được xác định cho điểm cuối đó.
Các ổ cắm là giao thức cụ thể - vì vậy việc triển khai tính duy nhất mà cả TCP / IP và UDP / IP sử dụng * (ipaddress: port), khác với ví dụ: IPX (Mạng, Nút và ... ahem, ổ cắm - nhưng khác Ổ cắm hơn có nghĩa là thuật ngữ "ổ cắm" chung. Số ổ cắm IPX tương đương với cổng IP). Nhưng, tất cả đều cung cấp một điểm cuối địa chỉ duy nhất.
Vì IP đã trở thành giao thức thống trị, một cổng (theo thuật ngữ mạng) đã trở nên đồng bộ với số cổng UDP hoặc TCP - là một phần của địa chỉ ổ cắm.
UDP không có kết nối - có nghĩa là không có mạch ảo nào giữa 2 điểm cuối được tạo. Tuy nhiên, chúng tôi vẫn coi các ổ cắm UDP là điểm cuối. Các hàm API làm rõ rằng cả hai chỉ là loại ổ cắm khác nhau - SOCK_DGRAM
là UDP (chỉ gửi tin nhắn) và SOCK_STREAM
là TCP (tạo mạch ảo).
Về mặt kỹ thuật, tiêu đề IP giữ Địa chỉ IP và giao thức trên đầu IP (UDP hoặc TCP) giữ số cổng. Điều này cho phép có các giao thức khác (ví dụ: ICMP không có số cổng, nhưng có thông tin địa chỉ IP).
Câu trả lời ngắn gọn.
Một cổng có thể được mô tả như một địa chỉ nội bộ trong một máy chủ xác định chương trình hoặc quy trình.
Một ổ cắm có thể được mô tả như một giao diện lập trình cho phép một chương trình giao tiếp với các chương trình hoặc quy trình khác, trên internet hoặc cục bộ.
Chúng là các thuật ngữ từ hai miền khác nhau: 'cổng' là một khái niệm từ mạng TCP / IP, 'socket' là một thứ API (lập trình). Một 'ổ cắm' được tạo ra (bằng mã) bằng cách lấy một cổng và tên máy chủ hoặc bộ điều hợp mạng và kết hợp chúng thành một cấu trúc dữ liệu mà bạn có thể sử dụng để gửi hoặc nhận dữ liệu.
Đây là những khái niệm mạng cơ bản vì vậy tôi sẽ giải thích chúng một cách dễ dàng nhưng toàn diện để hiểu chi tiết.
Vì vậy, một ổ cắm trong mạng là một thiết bị giao tiếp ảo được liên kết với một cặp (ip, port) = (địa chỉ, dịch vụ).
Ghi chú:
Hy vọng nó sẽ xóa bạn nghi ngờ
Sau khi đọc các câu trả lời được bình chọn xuất sắc, tôi thấy rằng điểm sau đây cần nhấn mạnh cho tôi, một người mới đến lập trình mạng:
Kết nối TCP-IP là các đường dẫn hai chiều kết nối một địa chỉ: kết hợp cổng với địa chỉ khác: kết hợp cổng. Do đó, bất cứ khi nào bạn mở kết nối từ máy cục bộ sang cổng trên máy chủ từ xa (giả sử www.google.com:80), bạn cũng đang liên kết số cổng mới trên máy của mình với kết nối, để cho phép máy chủ gửi những điều trở lại với bạn, (ví dụ 127.0.0.1:65234). Có thể hữu ích khi sử dụng netstat để xem xét các kết nối của máy của bạn:
> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 192.168.0.6.49871 17.172.232.57.5223 ESTABLISHED
...
123.132.213.231 # IP address
:1234 # port number
123.132.213.231:1234 # socket address
Một kết nối xảy ra khi 2 ổ cắm được liên kết với nhau.
Ổ cắm là một loại xử lý tệp đặc biệt được sử dụng bởi một quy trình để yêu cầu các dịch vụ mạng từ hệ điều hành. Địa chỉ ổ cắm là bộ ba: {giao thức, địa chỉ cục bộ, quy trình cục bộ} trong đó quy trình cục bộ được xác định bởi một số cổng.
Trong bộ TCP / IP, ví dụ:
{tcp, 193.44.234.3, 12345}
Cuộc hội thoại là liên kết giao tiếp giữa hai quá trình, do đó mô tả mối liên kết giữa hai quá trình. Liên kết là 5 tuple chỉ định hoàn toàn hai quy trình bao gồm một kết nối: {giao thức, địa chỉ cục bộ, quy trình cục bộ, địa chỉ nước ngoài, quy trình nước ngoài}
Trong bộ TCP / IP, ví dụ:
{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}
có thể là một hiệp hội hợp lệ.
Liên kết nửa là: {giao thức, địa chỉ cục bộ, quy trình cục bộ}
hoặc là
{giao thức, địa chỉ nước ngoài, quy trình nước ngoài}
trong đó chỉ định mỗi nửa của một kết nối.
Hiệp hội nửa còn được gọi là ổ cắm hoặc địa chỉ vận chuyển. Đó là, một ổ cắm là một điểm kết thúc cho giao tiếp có thể được đặt tên và giải quyết trong một mạng. Giao diện ổ cắm là một trong một số giao diện lập trình ứng dụng (API) cho các giao thức truyền thông. Được thiết kế để trở thành một giao diện lập trình giao tiếp chung, lần đầu tiên nó được giới thiệu bởi hệ thống UNIX 4.2BSD. Mặc dù nó chưa được tiêu chuẩn hóa, nhưng nó đã trở thành một tiêu chuẩn công nghiệp thực tế.
Một ổ cắm là một điểm cuối truyền thông. Một socket không liên quan trực tiếp đến họ giao thức TCP / IP, nó có thể được sử dụng với bất kỳ giao thức nào mà hệ thống của bạn hỗ trợ. API socket C mong muốn bạn trước tiên nhận được một đối tượng socket trống từ hệ thống mà sau đó bạn có thể liên kết với một địa chỉ socket cục bộ (để truy xuất trực tiếp lưu lượng đến cho các giao thức không có kết nối hoặc chấp nhận các yêu cầu kết nối đến cho các giao thức hướng kết nối) hoặc rằng bạn có thể kết nối với một địa chỉ ổ cắm từ xa (cho cả hai loại giao thức). Bạn thậm chí có thể thực hiện cả hai nếu bạn muốn kiểm soát cả hai, địa chỉ ổ cắm cục bộ mà ổ cắm bị ràng buộc và địa chỉ ổ cắm từ xa mà ổ cắm được kết nối. Đối với các giao thức không có kết nối, việc kết nối một ổ cắm thậm chí là tùy chọn nhưng nếu bạn không làm điều đó, bạn ' cũng sẽ phải chuyển địa chỉ đích với mỗi gói bạn muốn gửi qua ổ cắm vì làm thế nào khác ổ cắm sẽ biết nơi gửi dữ liệu này đến đâu? Ưu điểm là bạn có thể sử dụng một ổ cắm duy nhất để gửi các gói đến các địa chỉ ổ cắm khác nhau. Khi bạn đã cấu hình ổ cắm của mình và thậm chí có thể kết nối, hãy coi nó là một ống giao tiếp hai chiều. Bạn có thể sử dụng nó để truyền dữ liệu đến một số đích và một số đích có thể sử dụng nó để truyền dữ liệu lại cho bạn. Những gì bạn viết vào một ổ cắm được gửi đi và những gì đã nhận được có sẵn để đọc. Bạn có thể sử dụng nó để truyền dữ liệu đến một số đích và một số đích có thể sử dụng nó để truyền dữ liệu lại cho bạn. Những gì bạn viết vào một ổ cắm được gửi đi và những gì đã nhận được có sẵn để đọc. Bạn có thể sử dụng nó để truyền dữ liệu đến một số đích và một số đích có thể sử dụng nó để truyền dữ liệu lại cho bạn. Những gì bạn viết vào một ổ cắm được gửi đi và những gì đã nhận được có sẵn để đọc.
Mặt khác, các cổng là thứ mà chỉ các giao thức nhất định của ngăn xếp giao thức TCP / IP mới có. Các gói TCP và UDP có cổng. Một cổng chỉ là một số đơn giản. Sự kết hợp giữa cổng nguồn và cổng đích xác định một kênh liên lạc giữa hai máy chủ. Ví dụ: bạn có thể có một máy chủ sẽ là cả hai, một máy chủ HTTP đơn giản và một máy chủ FTP đơn giản. Nếu bây giờ một gói đến địa chỉ của máy chủ đó, làm sao biết đó là gói cho HTTP hay máy chủ FTP? Chà, nó sẽ biết vì máy chủ HTTP sẽ chạy trên cổng 80 và máy chủ FTP ở cổng 21, vì vậy nếu gói đến với cổng đích 80, thì nó dành cho máy chủ HTTP chứ không phải cho máy chủ FTP. Ngoài ra gói có một cổng nguồn vì không có cổng nguồn như vậy, một máy chủ chỉ có thể có một kết nối đến một địa chỉ IP tại một thời điểm. Cổng nguồn giúp máy chủ có thể phân biệt các kết nối giống hệt nhau: tất cả chúng đều có cùng một cổng đích, ví dụ cổng 80, cùng một IP đích (IP của máy chủ) và cùng một IP nguồn, vì tất cả chúng đều đến từ cùng một máy khách, nhưng vì chúng có các cổng nguồn khác nhau, nên máy chủ có thể phân biệt chúng với nhau. Và khi máy chủ gửi trả lời lại, nó sẽ thực hiện với cổng yêu cầu đến từ đó, theo cách đó, khách hàng cũng có thể phân biệt các phản hồi khác nhau mà nó nhận được từ cùng một máy chủ.
Cổng là phần dễ nhất, nó chỉ là một định danh duy nhất cho một ổ cắm. Ổ cắm là thứ mà các quá trình có thể sử dụng để thiết lập kết nối và liên lạc với nhau. Tall Jeff có một sự tương tự điện thoại tuyệt vời không hoàn hảo, vì vậy tôi quyết định sửa nó:
netstat
màn hình một thời gian. Tất cả các ổ cắm được chấp nhận từ một ổ cắm nghe chia sẻ cùng một cổng. Ergo một cổng không phải là một định danh duy nhất cho một ổ cắm.
Một ứng dụng bao gồm các cặp quy trình giao tiếp qua mạng (cặp máy khách-máy chủ). Các quy trình này gửi và nhận tin nhắn, vào và từ mạng thông qua giao diện phần mềm được gọi là socket . Xem xét sự tương tự được trình bày trong cuốn sách "Mạng máy tính: Cách tiếp cận từ trên xuống". Có một ngôi nhà muốn liên lạc với ngôi nhà khác. Ở đây, ngôi nhà tương tự như một quá trình, và cánh cửa đến một ổ cắm. Quá trình gửi giả định rằng có một cơ sở hạ tầng ở phía bên kia của cửa sẽ vận chuyển dữ liệu đến đích. Khi tin nhắn được gửi đến ở phía bên kia, nó sẽ đi qua cửa của người nhận (ổ cắm) vào nhà (xử lý). Hình minh họa này từ cùng một cuốn sách có thể giúp bạn:
Ổ cắm là một phần của lớp vận chuyển, cung cấp giao tiếp logic cho các ứng dụng. Điều này có nghĩa là theo quan điểm của ứng dụng, cả hai máy chủ đều được kết nối trực tiếp với nhau, mặc dù có rất nhiều bộ định tuyến và / hoặc chuyển đổi giữa chúng. Do đó, một ổ cắm không phải là một kết nối, nó là điểm cuối của kết nối. Các giao thức lớp vận chuyển chỉ được thực hiện trên các máy chủ chứ không phải trên các bộ định tuyến trung gian.
Cổngcung cấp phương tiện địa chỉ nội bộ cho một máy. Mục đích chính là cho phép nhiều quy trình gửi và nhận dữ liệu qua mạng mà không can thiệp vào các quy trình khác (dữ liệu của họ). Tất cả các ổ cắm được cung cấp với một số cổng. Khi một phân đoạn đến máy chủ lưu trữ, lớp vận chuyển sẽ kiểm tra số cổng đích của phân khúc. Sau đó, chuyển tiếp phân khúc đến ổ cắm tương ứng. Công việc phân phối dữ liệu trong phân đoạn lớp vận chuyển đến đúng ổ cắm được gọi là khử ghép kênh . Dữ liệu của phân khúc sau đó được chuyển tiếp đến quy trình được gắn vào ổ cắm.
Một ổ cắm là một cấu trúc trong phần mềm của bạn. Đó là ít nhiều một tập tin; Nó có các hoạt động như đọc và viết. Nó không phải là một thứ vật chất; đó là một cách để phần mềm của bạn đề cập đến những thứ vật lý.
Một cổng là một thứ giống như thiết bị. Mỗi máy chủ lưu trữ có một hoặc nhiều mạng (đó là các mạng vật lý); một máy chủ lưu trữ có một địa chỉ trên mỗi mạng. Mỗi địa chỉ có thể có hàng ngàn cổng.
Một ổ cắm chỉ có thể được sử dụng một cổng tại một địa chỉ. Ổ cắm phân bổ cổng xấp xỉ như phân bổ một thiết bị cho I / O hệ thống tệp. Khi cổng được phân bổ, không có ổ cắm nào khác có thể kết nối với cổng đó. Cổng sẽ được giải phóng khi đóng ổ cắm.
Hãy xem thuật ngữ TCP / IP .
từ Hướng dẫn Java Java :
Ổ cắm là một điểm cuối của liên kết giao tiếp hai chiều giữa hai chương trình đang chạy trên mạng. Một ổ cắm được liên kết với một số cổng để lớp TCP có thể xác định ứng dụng mà dữ liệu được gửi đến.
Cổng và ổ cắm có thể được so sánh với Chi nhánh Ngân hàng.
Số tòa nhà của "Ngân hàng" tương tự như địa chỉ IP. Một ngân hàng có các phần khác nhau như:
Vì vậy, 1 (bộ phận tài khoản tiết kiệm), 2 (bộ phận cho vay cá nhân), 3 (bộ phận cho vay mua nhà) và 4 (bộ phận khiếu nại) là các cảng.
Bây giờ hãy để chúng tôi nói bạn đi mở tài khoản tiết kiệm, bạn đến ngân hàng (địa chỉ IP), sau đó bạn đến "bộ phận tài khoản tiết kiệm" (cổng số 1), sau đó bạn gặp một trong những nhân viên làm việc trong "bộ phận tài khoản tiết kiệm ". Hãy để chúng tôi gọi anh ấy SAVINGACCOUNT_EMPLOYEE1 để mở tài khoản.
SAVINGACCOUNT_EMPLOYEE1 là mô tả ổ cắm của bạn, vì vậy có thể có SAVINGACCOUNT_EMPLOYEE1 để SAVINGACCOUNT_EMPLOYEEN. Đây là tất cả các mô tả ổ cắm.
Tương tự như vậy, các bộ phận khác sẽ có nhân viên làm việc theo họ và họ tương tự như ổ cắm.
Một socket là một cơ chế I / O dữ liệu. Cổng là một khái niệm hợp đồng của một giao thức truyền thông . Một ổ cắm có thể tồn tại mà không cần một cổng. Một cổng có thể tồn tại với một ổ cắm cụ thể (ví dụ: nếu một số ổ cắm đang hoạt động trên cùng một cổng, có thể được phép cho một số giao thức).
Một cổng được sử dụng để xác định ổ cắm mà máy thu nên định tuyến gói đến, với nhiều giao thức, nhưng không phải lúc nào cũng cần và lựa chọn ổ cắm nhận có thể được thực hiện bằng các phương tiện khác - một cổng hoàn toàn là một công cụ được sử dụng bởi trình xử lý giao thức hệ thống con. ví dụ: nếu một giao thức không sử dụng cổng, các gói có thể đi đến tất cả các ổ cắm nghe hoặc bất kỳ ổ cắm nào.
Thuật ngữ TCP / IP tương đối là những gì tôi giả sử được ngụ ý bởi câu hỏi. Trong điều khoản của Giáo dân:
PORT giống như số điện thoại của một ngôi nhà cụ thể trong một mã zip cụ thể. Mã ZIP của thị trấn có thể được coi là địa chỉ IP của thị trấn và tất cả các ngôi nhà trong thị trấn đó.
Mặt khác, SOCKET giống như một cuộc gọi điện thoại được thiết lập giữa các điện thoại của một cặp nhà nói chuyện với nhau. Những cuộc gọi đó có thể được thiết lập giữa các ngôi nhà trong cùng một thị trấn hoặc hai ngôi nhà ở các thị trấn khác nhau. Đó là con đường được thiết lập tạm thời giữa cặp điện thoại nói chuyện với nhau, đó là SOCKET.
Theo nghĩa rộng, Ổ cắm - chỉ là một ổ cắm, giống như ổ cắm điện, cáp hoặc điện thoại của bạn. Một điểm mà "công cụ cần thiết" (sức mạnh, tín hiệu, thông tin) có thể đi ra và đi vào. Nó ẩn rất nhiều thứ chi tiết, không cần thiết cho việc sử dụng "những thứ cần thiết". Theo cách nói của phần mềm, nó cung cấp một cách chung để xác định cơ chế giao tiếp giữa hai thực thể (những thực thể đó có thể là bất cứ thứ gì - hai ứng dụng, hai thiết bị riêng biệt, không gian User & Kernel trong HĐH, v.v.)
Một cổng là một phân biệt đối xử điểm cuối. Nó phân biệt một điểm cuối với điểm khác. Ở cấp độ mạng, nó phân biệt ứng dụng này với ứng dụng khác, để ngăn xếp mạng có thể truyền thông tin đến ứng dụng phù hợp.
Đã có câu trả lời lý thuyết đã được đưa ra cho câu hỏi này. Tôi muốn đưa ra một ví dụ thực tế cho câu hỏi này, điều này sẽ làm rõ sự hiểu biết của bạn về Ổ cắm và Cổng.
Tôi tìm thấy nó ở đây
Ví dụ này sẽ hướng dẫn bạn thông qua quá trình kết nối với một trang web, chẳng hạn như Wiley. Bạn sẽ mở trình duyệt web của mình (như Mozilla Firefox) và nhập www.wiley.com vào thanh địa chỉ. Trình duyệt web của bạn sử dụng máy chủ Hệ thống Tên miền (DNS) để tra cứu tên www.wiley.com để xác định địa chỉ IP của nó. Trong ví dụ này, địa chỉ là 192.0.2.100.
Firefox tạo kết nối đến địa chỉ 192.0.2.100 và tới cổng nơi máy chủ web của lớp ứng dụng đang hoạt động. Firefox biết cổng nào mong đợi vì đây là cổng nổi tiếng. Cổng nổi tiếng cho một máy chủ web là cổng TCP 80.
Ổ cắm đích mà Firefox cố gắng kết nối được viết dưới dạng socket: port hoặc trong ví dụ này, 192.0.2.100:80. Đây là phía máy chủ của kết nối, nhưng máy chủ cần biết nơi gửi trang web bạn muốn xem trong Mozilla Firefox, vì vậy bạn cũng có một ổ cắm cho phía máy khách của kết nối.
Kết nối phía máy khách được tạo thành từ địa chỉ IP của bạn, chẳng hạn như 192.168.1.25 và số cổng động được chọn ngẫu nhiên. Ổ cắm được liên kết với Firefox trông giống như 192.168.1.25:49175. Vì các máy chủ web hoạt động trên cổng TCP 80, cả hai ổ cắm này đều là ổ cắm TCP, trong khi nếu bạn kết nối với máy chủ hoạt động trên cổng UDP, cả ổ cắm máy chủ và máy khách sẽ là ổ cắm UDP.
Ổ cắm là một bản tóm tắt được cung cấp bởi kernel cho các ứng dụng người dùng cho I / O dữ liệu. Loại ổ cắm được xác định bởi giao thức xử lý, giao tiếp IPC, v.v. Vì vậy, nếu ai đó tạo ổ cắm TCP, anh ta có thể thực hiện các thao tác như đọc dữ liệu vào ổ cắm và ghi dữ liệu vào nó bằng các phương thức đơn giản và xử lý giao thức cấp thấp hơn như chuyển đổi TCP và chuyển tiếp gói đến các giao thức mạng cấp thấp hơn được thực hiện bằng cách thực hiện ổ cắm cụ thể trong kernel. Ưu điểm là người dùng không cần phải lo lắng về việc xử lý các lỗi cụ thể của giao thức và chỉ nên đọc và ghi dữ liệu vào ổ cắm như một bộ đệm thông thường. Điều tương tự cũng đúng trong trường hợp IPC, người dùng chỉ cần đọc và ghi dữ liệu vào socket và kernel xử lý tất cả các chi tiết cấp thấp hơn dựa trên loại socket được tạo.
Cổng cùng với IP giống như cung cấp một địa chỉ cho ổ cắm, mặc dù không cần thiết nhưng nó giúp truyền thông mạng.
Một cổng đơn có thể có một hoặc nhiều ổ cắm được kết nối với các IP bên ngoài khác nhau giống như nhiều ổ cắm điện.
TCP 192.168.100.2:9001 155.94.246.179:39255 ESTABLISHED 1312
TCP 192.168.100.2:9001 171.25.193.9:61832 ESTABLISHED 1312
TCP 192.168.100.2:9001 178.62.199.226:37912 ESTABLISHED 1312
TCP 192.168.100.2:9001 188.193.64.150:40900 ESTABLISHED 1312
TCP 192.168.100.2:9001 198.23.194.149:43970 ESTABLISHED 1312
TCP 192.168.100.2:9001 198.49.73.11:38842 ESTABLISHED 1312
Ổ cắm là sự trừu tượng hóa SW của điểm cuối mạng, được sử dụng làm giao diện cho ứng dụng. Trong Java, C # nó được đại diện bởi đối tượng, trong Linux, Unix nó là một tệp.
Cổng chỉ là một thuộc tính của một socket mà bạn đã chỉ định nếu bạn muốn thiết lập một giao tiếp. Để nhận gói tin từ một ổ cắm, bạn phải liên kết nó với cổng cục bộ và NIC cụ thể (với địa chỉ IP cục bộ) hoặc tất cả các NIC (INADDR_ANY được chỉ định trong lệnh gọi liên kết). Để gửi gói, bạn phải chỉ định cổng và IP của ổ cắm từ xa.
Một socket về cơ bản là một điểm cuối cho giao tiếp mạng, bao gồm ít nhất một địa chỉ IP và một cổng. Trong Java / C #, socket là mức triển khai cao hơn ở một phía của kết nối hai chiều.
Ngoài ra, một định nghĩa trong tài liệu Java .
Hải cảng:
Một cổng có thể đề cập đến một điểm kết nối vật lý cho các thiết bị ngoại vi như cổng nối tiếp, song song và USB. Cổng hạn cũng đề cập đến một số điểm kết nối Ethernet nhất định, như các điểm trên bộ tập trung, bộ chuyển mạch hoặc bộ định tuyến.
Ổ cắm:
Một ổ cắm đại diện cho một kết nối duy nhất giữa hai ứng dụng mạng. Hai ứng dụng này thường chạy trên các máy tính khác nhau, nhưng ổ cắm cũng có thể được sử dụng để liên lạc giữa các máy tính trên một máy tính. Các ứng dụng có thể tạo ra nhiều ổ cắm để giao tiếp với nhau. Các ổ cắm là hai chiều, có nghĩa là một trong hai bên của kết nối có khả năng gửi và nhận dữ liệu.
Một cổng biểu thị một điểm cuối giao tiếp trong vận chuyển TCP và UDP cho giao thức mạng IP. Một socket là một phần mềm trừu tượng cho một điểm cuối giao tiếp thường được sử dụng trong việc triển khai các giao thức này (API socket). Một triển khai thay thế là API XTI / TLI.
Xem thêm:
Stevens, WR 1998, Lập trình mạng UNIX: API mạng: Ổ cắm và XTI; Tập 1, Hội trường Prentice.
Stevens, WR, 1994, TCP / IP Illustrated, Tập 1: The Protocol, Addison-Wesley.