PDA

View Full Version : Socket vs Port ?


Miracle
01-06-2007, 23:48
Khi kết nối CSDL mysql trong thì nên dùng port hay socks ?

Thằng nào có lợi hơn ?

nhtuong
02-06-2007, 09:21
Chưa hiểu ý lắm! Theo CED, SOCKS là gì?

Miracle
02-06-2007, 10:26
Nhầm chữ socks với socket :D

Description
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )

Parameters


server
The MySQL server. It can also include a port number. e.g. "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for the localhost.

If the PHP directive mysql.default_host is undefined (default), then the default value is 'localhost:3306'


Nếu ta khai báo localhost thì hệ thống sẽ dùng port mặc định là 3306
Nếu dùng socket thì khai báo "localhost::/path/to/socket"

Nên dùng thằng nào đây ?

nhtuong
02-06-2007, 10:50
CED này đố anh em không ta!
Như vậy có phải rõ ràng hơn không?

SOCKS (SOCKetS) là một giao thức kết nối thông qua việc chia thành nhiều port. Mỗi một socket có nhiều port, ứng với mỗi port là một dịch vụ nào đó. Socket được ví như ổ cắm điện mỗi port ví như là các lỗ cắm. Cắm đúng vào anh nào thì anh đó hoạt động. Khái niệm Socket dùng cho rất nhiều kỹ thuật có liên quan đển việc giao tiếp mạng.

Sở dĩ trong PHP, CED thấy người ta dùng lúc thì có port luc thì không là vì PHP đã hỗ trợ port mặc định nếu dùng lênh mysql_connect(). Tuy nhiên, không phải lúc nào trên localhost của MySQL cũng sử dụng duy nhất 1 port 3306. Có lúc CED phái sử dụng 2 port cùng lúc cho 2 server dữ liệu MySQL khác nhau ... làm 2 việc khác nhau. Và như thế cái port number phát huy tác dụng.

Vậy nhé! :haha:

Miracle
02-06-2007, 10:51
Vậy là dùng socket dở hơn port ?

nhtuong
02-06-2007, 10:57
Sao chưa chịu hiểu nữa!
Vấn đề là dùng port hay không dùng port chứ không phải socket và port! :baffle: Chúng điều thuộc một có chế là SOCKS!
Tùy nếu dùng 1 server và có hỗ trợ mặc định thì không cần dùng port.

rcrackvn
02-06-2007, 18:45
CED này đố anh em không ta!
Như vậy có phải rõ ràng hơn không?

SOCKS (SOCKetS) là một giao thức kết nối thông qua việc chia thành nhiều port. Mỗi một socket có nhiều port, ứng với mỗi port là một dịch vụ nào đó. Socket được ví như ổ cắm điện mỗi port ví như là các lỗ cắm. Cắm đúng vào anh nào thì anh đó hoạt động. Khái niệm Socket dùng cho rất nhiều kỹ thuật có liên quan đển việc giao tiếp mạng.

Sở dĩ trong PHP, CED thấy người ta dùng lúc thì có port luc thì không là vì PHP đã hỗ trợ port mặc định nếu dùng lênh mysql_connect(). Tuy nhiên, không phải lúc nào trên localhost của MySQL cũng sử dụng duy nhất 1 port 3306. Có lúc CED phái sử dụng 2 port cùng lúc cho 2 server dữ liệu MySQL khác nhau ... làm 2 việc khác nhau. Và như thế cái port number phát huy tác dụng.

Vậy nhé! :haha:

tầm bậy tầm bạ, socket không phải là 1 giao thức :))
socket là 1 communication endpoint. Socket cũng chẳng "có" port nào hết, mà người ta "bind" 1 address name vào 1 socket, đố ông declare 1 socket rồi bind 2 address vào nó để nó có ... 2 port :sexy_girl:
socket mà mysql sử dụng là unix domain socket, và chỉ hoạt động đc với điều kiện app sử dụng database phải nằm trên cùng 1 host với mysql server. Ưu điểm so với tcp socket là nó nhanh hơn, ngoài ra unix domain socket còn là 1 cơ chế của IPC (interprocess communication), dùng để pass thông tin qua lại giữa các process với nhau.
Còn nếu app không nằm cùng host với mysql server thì không thể sử dụng unix domain socket, mà phải sử dụng tcp socket (cái có port 3306 đó):baffle:

nhtuong
02-06-2007, 19:26
Ý của CED thế nào nhỉ? :haha:

Có cần hỏi thêm communication endpoint, unix domain socket, TCP Socket, UDP Socket hay IPC là gì không?

Tranh thủ hỏi rcrackvn nhé!:haha:

REF:
http://en.wikipedia.org/wiki/SOCKS
SOCKS is an Internet protocol that allows client-server applications to transparently use the services of a network firewall. SOCKS is an abbreviation for "SOCKetS" .
http://en.wikipedia.org/wiki/Internet_socket
An Internet socket is composed of the following:
Protocol (TCP, UDP, raw IP)
Local IP address
Local port
Remote IP address
Remote port

Vào Yahoo! Messenger> Messenger> Connection Preferences > Uses proxies xem có port không nhe!

rcrackvn
02-06-2007, 21:15
hì hì,
bạn nhầm nhiều thứ lắm, thứ nhất: socket là socket, khác với SOCKS là giao thức. Cũng như 'unix' là chỉ 1 streamline các hệ điều hành phát triển từ Bells Lab, còn 'Unix' là registered trademark thuộc về Open Group. Thảo luận về kỹ thuật không nên nhầm lẫn như vậy.

Bạn muốn ám chỉ giao thức, thì đúng là có giao thức SOCKS4(rfc1413) và SOCKS5(rfc1928). Nhưng các giao thức này chẳng có mắc mớ gì với khái niệm socket sử dụng bởi mysql. 2 giao thức này quy định việc relay 1 thông tin từ client tới server thông qua 1 trung gian là SOCKS server.

Còn về việc bạn cho là khái niệm port gắn liền với socket thì mình trả lời là không phải. port là khái niệm ở tầng TCP, socket là thứ, như tui nói, là điểm đầu cuối của 1 giao tiếp, giao tiếp này không nhất thiết phải là TCP. Nếu bạn lập trình mạng dưới *nix, bạn xem manpage của socket() call sẽ rõ


$ man socket


Khi 1 process yêu cầu kernel tạo cho nó 1 socket, process phải chỉ định 3 thứ:
- protocol family (như là : AF_INET: TCP/UDP, AF_LOCAL: unix domain socket ... )
- socket type: như là SOCK_STREAM (TCP socket), SOCK_DGRAM (UDP socket), SOCK_SEQPACKET(SCTP socket)
- protocol.

chỉ khi nào socket bạn create với protocol family là AF_INET, socket type là SOCK_STREAM thì nó mới là TCP socket, và bạn có thể chỉ định thông tin liên quan tới TCP protocol address cho nó, như IP, port, các TCP option. Nhưng nói trắng ra là tcp socket KHÔNG PHẢI là thứ duy nhất có thể được dùng để communicate, nên phân biệt điều này.

Đây là cấu trúc xác định 1 protocol name cho 1 tcp socket:

struct sockaddr_in {
short sin_family; /* should be AF_INET */
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8]; /* not used, must be zero */
};

struct in_addr {
unsigned long s_addr;
};


Với unix domain socket, protocol family = AF_LOCAL, hoàn toàn khác với tcp socket, và unix domain socket cũng chẳng có khái niệm gì là port, ip cả. Đây là cấu trúc protocol name của unix domain socket:


struct sockaddr_un {
sa_family_t sun_family; /* AF_LOCAL */
char sun_path[104]; /* null-terminated pathname */
};



Như bạn thấy: 1 unix domain socket chỉ có 2 thứ để xác định nó, là sun_family, và pathname.

Còn riêng đối với bạn chủ topic: để tui trả lời tóm tắt lại:
- mysql có thể sử dụng 2 loại socket để giao tiếp với app: unix domain socket , và tcp socket(cái có port á)
- nếu app của bạn nằm chung host với mysql server, sử dụng unix domain socket sẽ nhanh hơn sử dụng tcp socket
- nếu app của bạn không nằm cùng host với mysql server, bắt buộc phải sử dụng tcp socket

zeroonea
02-06-2007, 23:48
{@:

- Okay, tổng kết:

- socket là 1 kỹ thuật còn socks là 1 giao thức.

- 2 thuộc tính quan trọng của socket là address domain và socket type.

+ address domain có 2 kiểu phổ biến là unix domain và internet domain

++ unix domain (AF_UNIX or AF_LOCAL) được sử dụng khi 2 tiến trình cùng nằm trên 1 hệ thống
++ internet domain (AF_INET) thường được sử dụng khi 2 tiến trình nằm trên 2 host khác nhau over internet.

++ 2 kiểu domain trên sẽ có chuẩn khác nhau về địa chỉ của nó:

+++ unixdomain: 1 chuỗi các ký tự (file system path)
+++ internet domain: ip address or domain name + port number

+ socket type có 2 loại phổ biến là stream sockets và datagram sockets, 2 loại này dùng 2 giao thức khác nhau:

++ stream sockets dùng giao thức TCP
++ datagram sockets dùng giao thức UDP

- mysql support 2 kiểu address domain:unix domain, internet domain. Nó sẽ tạo ra socket server để listen kết nối tới.

- ----------------------

- Ứng dụng socket có 2 loại: socket server (http server, FTP, POP3 server...) và socket client (nhiều quá :D )

- Để connect tới 1 socket server over internet (internet domain) ta cần ip or domain + port mà socket server đó listen (như phần set socks proxy của yahoo, socks proxy là ct dùng socket server + socks protocol (4,5, 6 in future :D) )

:@}

nhtuong
03-06-2007, 00:40
rcrackvn có thể solve một số problem sau để mọi người rõ hơn:

1. "unix domain socket" khác "Unix domain socket"?

2. Bạn khẳng định TCP socket và local Unix domain socket là 2 loại sử dụng trong Mysql? Bạn có thể cấu hình sử dụng cho từng loại không? (Bạn chú ý file .sock)

3. Socket khác Port chỗ nào? ( so sánh TCP port và local Unix domain socket) Socket nhanh hơn là vì sao?

4. Tại sao tôi phải dùng :Unix domain socket" trong khi tôi chỉ sử dụng hệ thống Windows cả App và Server Database. Từ trước đến giờ kết nối dữ liệu từ máy local hay từ xa tôi chưa nghe ai phải cấu hình lại file socket. Có chăng chỉ là set lại biến mysql.default_socket và mysqli.default_port.

Bạn không cần phải giải thích rắc rối viết socket Unix bằng C như thế nào vì thật ra vấn đề mọi người quan tâm không phải là bạn hiểu đoạn code đó nói gì mà là bạn sử dụng các biến hỗ trợ cấu hình dùng để kết nối với database server khác nhau như thế nào. Các tài liệu nói về Unix domain socket thì không thiếu. Cả những đoạn code và nhưng giải thích nữa. Nhưng nếu bạn là người có sử dụng qua nó thì tôi xin được chỉ giáo!

rcrackvn
03-06-2007, 08:30
1. như mình đã nói, thì UNIX là thương hiệu đã được Opengroup đăng ký. Còn unix (các chữ đều viết thường ) là ám chỉ 1 dòng các hệ điều hành được bắt nguồn từ Bells Lab, gồm BSD-based, SVR3 (system V release 3), SVR 4 (system V release 4) ... các hệ điều hành unix chính hiệu như DigiUnix, Solaris đều phải tuân theo 1 chuẩn là SUS (single unix specification) và toàn bộ là POSIX compliant, do đó nói unix domain socket là ám chỉ tới 1 loại socket được SUS và POSIX quy định, hễ hệ điều hành nào muốn comply thì phải support nó.

2. Chính xác, bạn không tin thì cứ obtain mysql source mà xem.
3. socket KHÔNG mắc mớ gì tới port, 1 lần nữa tui confirm như vậy. Khi process của bạn yêu cầu kernel cung cấp cho 1 socket, ví dụ như TCP socket, thông qua socket() system call, kernel sẽ cấp cho process 1 socket file descriptor, để phân biệt với các socket đang sử dụng bởi các network program khác. socket khởi tạo ban đầu này là unamed socket, sau đó bạn phải give nó 1 cái protocol name, protocol name này contain info để kernel xác định socket đó, ví dụ nếu là TCP socket, thì protocol name chứa info như local ip, port. Nhưng nếu là unix domain socket, thì protocol name chỉ chứa info duy nhất để xác định socket, đó là path.

Giả tỉ tui code 1 server app sử dụng TCP socket, đâu đó trong server code tui sẽ phải làm như sau:

int listenfd, connfd;
struct sockaddr_in server;

listenfd = socket(AF_INET, SOCK_STREAM, 0); // unamed TCP socket
memset(&server, sizeof(server));

// chỉ định protocol name cho unamed TCP socket:
server.sin_family = AF_INET; // address family là TCP
server.sin_port = htons(12345); // port
server.sin_addr.s_addr = htonl(INADDR_ANY) // bind vào local 0.0.0.0 address

// thực hiện gán protocol name cho socket:
bind(listenfd, (struct sockaddr *) &server, sizeof(server));

// biến socket thành listening socket:
listen(listenfd, 1024);

// accept network client:
connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);

//write cho client dòng chữ "abcd"
write(connfd, "abcd", 4);


Nhưng với 1 server tương tự sử dụng unix domain socket:

#define PATH "/tmp/mysql.sock"

int listenfd, connfd;
struct sockaddr_un client, server;
socklen_t clilen;

listenfd = socket(AF_LOCAL, SOCK_STREAM, 0); // unamed unix domain socket
unlink(PATH); // xóa file '/tmp/mysql.sock' nếu tồn tại
memset(&server, 0, sizeof(server));

// chỉ định protocol name cho unix domain socket
server.sun_family = AF_LOCAL;
strcpy(server.sun_path, PATH);

// gán protocol name vào unamed socket
bind(listenfd, (SA *) &server, sizeof(server));

// biến socket thành listening socket
listen(listenfd, LISTENQ);

// accept network client
clilen = sizeof(client);
connfd = accept(listenfd, (struct sockaddr *) &client, &clilen));

// write cho client 4 chữ "abcd"
write(connfd, "abcd", 4);


bạn thấy sự khác nhau ở 2 cái không ? khái niệm port chẳng liên quan gì tới khái niệm về socket, port chỉ là 1 trong những thông tin được dùng để "định danh" 1 socket trong trường hợp socket đó là TCP socket, và như tui nói ở post trên, TCP socket KHÔNG PHẢI là thứ duy nhất có thể được dùng để communicate.

Còn câu hỏi unix domain socket nhanh hơn là vì sao:
- đối với tcp socket, để có thể trao đổi data giữa client và server, client và server bắt buộc phải sử dụng cùng 1 loại socket type là TCP socket, giữa client và server phải qua 1 bước thiết lập kết nối là TCP three-way handshake, sau đó khi kết thúc kết nối lại phải trải qua 4 bước để kết thúc hoàn toàn. Đối với server sử dụng cho mục đích nho nhỏ thì không sao, nhưng với các enterprise server, 1 giây nhận hàng trăm ngàn yêu cầu xử lý, việc phải thiết lập connection như thế đối với mỗi request sẽ là 1 vấn đề.
- đối với unix domain socket, yêu cầu đơn giản hơn, chỉ là client app và server app nằm chung 1 host, sử dụng cùng 1 loại socket type là unix domain socket, client chỉ định path tới nơi mà server socket đang bind() ở đó, connect() tới đó, và thế là có thể send data qua lại với nhau. unix domain socket còn nhiều lợi điểm nữa là có thể được dùng làm IPC, để pass các control data giữa những process với nhau, nhưng tui không muốn đề cập thêm

4. Windows không phải là unix, nhưng theo tui nhớ, kể từ win2k, windows xây dựng 1 lớp API tương thích với POSIX, nên việc sử dụng 1 unix domain socket chẳng có gì là lạ. Bạn từng nghe đến cygwin chưa ? cygwin là port của *nix sang windows, cũng xây dựng 1 POSIX-compliant layer, nếu không làm sao cygwin có thể port được những native *nix package sang win để run ?

Bạn xài mysql được port qua windows thì là:
- 1 là mysql windows package là precompiled binary, mặc định là sử dụng cả 2 loại socket, nếu không thể tạo được unix domain socket thì sử dụng tcp socket. Bạn không tin thì cứ việc add thêm dòng 'skip-networking' vào my.cnf để cancel việc sử dụng tcp socket, rồi sử dụng 1 mysql client ở host khác xem bạn connect được vào mysql server không thì biết.

5. đúng là tài liệu về unix domain socket không thiếu, nhưng số người hiểu rõ về thực chất của nó là gì thì không nhiều lắm:haha:. Ngay cả trên usenet newsgroup hàng ngày cũng có không bít bi nhiêu là câu hỏi về unix domain socket.

PS: topic này đã đi xa quá yêu cầu của người post ban đầu, bạn muốn thảo luận về sockets có lẽ nên move sang 1 topic khác. Chúc bạn vui vẻ:smile:

nhtuong
04-06-2007, 17:13
PS: topic này đã đi xa quá yêu cầu của người post ban đầu, bạn muốn thảo luận về sockets có lẽ nên move sang 1 topic khác.

Bạn nói đúng! Vấn đề quan tâm không đi xa như vậy! Bạn có thể lập một topic nói về các loại socket để thảo luận nhiều hơn. Vì tôi thấy bạn có khả năng tốt về mảng này. Bạn có thể chia sẽ kinh nghiệm cho mọi người. Việc giải thích của bạn về Cygwin chạy trên Windows không nhằm mục đích giải thích tại sao phải dùng "Unix domain socket" trong khi tôi vẫn đang dùng Windows. Vì thực chất việc cấu hình và sử dụng "Unix domain socket" chỉ khi bạn phát triển một ứng dụng có server database chạy trên Linux (trường hợp LAMP đấy bạn!).

Nhưng cái cốt lõi của vấn đề bạn vẫn chưa muốn trả lời đó là cấu hình và sử dụng cho từng loại TCP socket và local Unix domain socket như thế nào? Khi nào tôi cần sử dụng TCP socket và ngược lại cho local Unix domain socket?
Bạn lưu ý tôi là nhà lập trình ứng dụng, nên không cần quan tâm đến code server database vì trong thực tế tôi không cần can thiệp. Và tôi nói thật, nếu bạn code những dòng này thì bạn làm việc cho MySQL AB chứ không cần đi code ứng dụng làm gì nữa! :baffle: Nhọc nhằng lắm!

Ok, lần sau nếu bạn muốn tiếp tục topic này thì hãy cho một cấu hình rõ ràng hơn cho nhà phát triển ứng dụng dùng MySQL Database Server. Nếu không hãy lập tiếp topic về các loại socket hoặc Unix vs Windows mọi người sẽ cùng bạn thảo luận tiếp.

rcrackvn
05-06-2007, 00:29
thôi sẵn topic này tui làm thử cái test, để ai chưa biết có thể phân biệt việc sử dụng tcp socket (server listen on port 3306) hoặc unix domain socket (default để client giao tiếp với server là file /tmp/mysql.sock)

Test case như thế này: (do tui không cài php nên dùng mysql client (console) để kết nối với mysql server). với mysql client (console), có thể chỉ định protocol muốn connect bằng argument '--protocol'
- đầu tiên là start mysql sử dụng duy nhất unix domain socket
- kiểm tra không thấy cái gì listen ở port 3306 (do disable tcp socket), chỉ thấy file /tmp/mysql.sock (unix domain)
- kiểm tra kết nối với mysql server sử dụng protocol là tcp: không được
- kiểm tra kết nối với mysql server sử dụng protocol là unix socket: OK
- kế tiếp là restart lại mysql sử dụng cả 2 loại socket là tcp và unix domain socket
- kiểm tra thấy mysql server listen ở port 3306, và có file /tmp/mysql.sock là unix domain socket
- kết nối với server sử dụng tcp: OK
- kết nối với server sử dụng unix domain socket: OK

option liên quan tới việc config này có thể được set bằng cách edit file cấu hình mysql :'my.cnf', comment out dòng 'skip_networking' để disable TCP, hoặc uncomment nó để enable cả 2 loại socket.

Ở đây tui không edit file 'my.cnf' mà pass thẳng cái option '--skip_networking' vào argument khi start mysql server.

tui capture lại, hình chắc hơi bự:amazed:
http://www.pixloads.com/files/23934/mysql_unixsocket_vs_tcp.JPG

Còn về việc khi nào sử dụng tcp hoặc unix domain socket, thì ở trên có nói mấy lần rùi, giờ túm lại thêm cái nữa:
- unix domain socket nhanh hơn tcp socket trong việc khởi tạo kết nối, không cần kernel phải làm nhiều việc để thiết lập 1 kết nối như đối với tcp
- unix domain socket chỉ sử dụng khi cả mysql server và app sử dụng mysql server nằm chung 1 host
- unix domain socket tăng mức độ bảo mật hơn tcp socket 1 tí, ví dụ trong trường hợp ai đó biết pass database, họ cũng không thể remote connect vào mysql server, vì server chỉ chấp nhận local connection.

vậy tại sao lại cần tcp socket: trường hợp app cần sử dụng db lại không nằm trên db server, thí dụ ai đó config webserver nằm khác với database server, thì bắt buộc phải sử dụng tcp socket thôi, vì unix socket không thể đc dùng để kết nối trong trường hợp này.

Tuy nhiên, nếu site có số lượng người truy cập không quá đông (đông là vài nghìn request truy cập db / giây) thì gần như cũng chẳng có gì khác biệt giữa việc sử dụng unix domain socket và tcp socket.

ps: bạn có vẻ phân biệt giữa 1 người lập trình ứng dụng, và dân lập trình mạng như tui, mấy cái code này tại bạn không code mạng nên tưởng nó cao siêu, chứ nó cũng basic lắm:byebye:. Cao siêu là phải nói implement semaphore, usermode spinlock, hoặc code multithreading network app, làm sao bảo đảm đc thread-safety trong network app cho đúng với mọi tình huống có thể xảy ra với network condition kìa, mí cái nì thì ... bõ bẽn gì:smile:

zeroonea
05-06-2007, 01:41
{@:

- bạn rcrackvn ơi, cho mình xin cái Y!M ID :D

:@}

nhtuong
05-06-2007, 10:07
Cuối cùng thì rcrackvn cũng làm cái gì đó mát lòng anh em!

Ok, tạm thời dừng lại ở chỗ phân biệt đâu là SOCKET, đâu là TCP (như demo)!

Nhưng demo của bạn vẫn nằm trong một phạm vi quan tâm của "database server", TCP và socket nó hoạt động như thế nào! Tôi rất quan tâm đến chữ Unix trong từ "Unix Domain Socket" ở đây theo như lời giải thích của bạn! Tại sao không là cái gì khác mà phải Unix?

Chính xác, tôi phải phân biệt đâu là nhà lập trình ứng dụng đâu là người lập trình hệ thống. Với người lập trình ứng dụng PHP trên Windows chẳng hạn, họ phải sửa cấu hình như thế nào cho code nguồn của họ để có thể kết nối với một database server nằm trên hệ thống Linux. (cấu hình lại file .sock và một số biến môi trường của MySQL cho PHP trong php.ini). Tôi rất quan tâm đến vấn đề này nếu bạn biết thì dành ít thời gian cho nó nhé! Anh em hoan nghênh bạn bàn về vấn đề này một cách bài bản hơn! Vì đây là một vấn đề thực tế cần sử dụng khi triển khai một ứng dụng mang tính chất phân tán.

rcrackvn
05-06-2007, 10:35
Cuối cùng thì rcrackvn cũng làm cái gì đó mát lòng anh em!

Ok, tạm thời dừng lại ở chỗ phân biệt đâu là SOCKET, đâu là TCP (như demo)!

Nhưng demo của bạn vẫn nằm trong một phạm vi quan tâm của "database server", TCP và socket nó hoạt động như thế nào! Tôi rất quan tâm đến chữ Unix trong từ "Unix Domain Socket" ở đây theo như lời giải thích của bạn! Tại sao không là cái gì khác mà phải Unix?

Chính xác, tôi phải phân biệt đâu là nhà lập trình ứng dụng đâu là người lập trình hệ thống. Với người lập trình ứng dụng PHP trên Windows chẳng hạn, họ phải sửa cấu hình như thế nào cho code nguồn của họ để có thể kết nối với một database server nằm trên hệ thống Linux. (cấu hình lại file .sock và một số biến môi trường của MySQL cho PHP trong php.ini). Tôi rất quan tâm đến vấn đề này nếu bạn biết thì dành ít thời gian cho nó nhé! Anh em hoan nghênh bạn bàn về vấn đề này một cách bài bản hơn! Vì đây là một vấn đề thực tế cần sử dụng khi triển khai một ứng dụng mang tính chất phân tán.

Mình hông hiểu câu hỏi "Tại sao không phải là cái gì khác mà phải là unix trong cụm từ unix domain socket ?", nên mình trả lời theo cách mình interprete câu hỏi này:
- Nếu ai muốn hiểu thêm về nguồn gốc của unix domain socket, thì có lẽ nên đọc sơ về lịch sử phát triển, dẫn tới các unix variant hiện nay, chủ yếu adapt 2 main stream unix base là SVR4 (system V, release 4) và BSD-based (4.4BSD). Cái này hơi ngoài lề 1 chút, nhưng mình cũng nói: ban đầu, khi chưa có các chuẩn POSIX (portable operating system interface) và SUS (single unix specification), code viết cho các unix variant khác nhau, đem compile lên hệ thống khác sẽ không chạy. POSIX ra đời để code viết trên unix platform này có thể compile mà không cần modify trên platform khác.
- Tại sao không là linux domain socket, hoặc windows domain socket ? Như bạn biết, mặc dù không thực sự là 1 unix os, nhưng linux comply với POSIX, nên nó cũng phải chấp nhận việc sử dụng các quy tắc chung về đặt tên, về structure, các technique mà POSIX đề ra. Giả dụ Linus lúc đó có thể học theo unix, implement cơ chế của unix domain socket, nhưng ổng buồn buồn đặt tên lại là linux domain socket, đổi các structure lại từ sockaddr_un thành sockaddr_lin =), thì khi đó, mặc dù cơ chế hoạt động có thể giống, nhưng linux không thể gọi là POSIX compliant được, và code trên linux cũng không thể port qua unix unmodified.
- Câu trả lời tương tự đối với windows, windows có thể implement riêng 1 cái gọi là windows domain socket, nhưng để nó comply với POSIX, nó phải provide unix domain socket, mãi cho tới gần đây thì win mới có 1 lớp API có thể gọi là partly POSIX-compliant

- tại sao bản windows port của mysql lại có unix domain socket: đơn giản vì mysql ban đầu viết cho *nix-like OS, sau đó mới port qua win.

Thực sự thì web app developer không cần quan tâm tới mấy cái khái niệm này, chỉ cần biết là có 2 cách để communicate với 1 mysql server, còn làm sao để communicate thì cả trên mysql site và php.net site cũng đã có manual, tui không trích lại. Mà nói chung cũng chẳng có gì phức tạp, chỉ có viết 1 dbconn.php, khai báo 1 trong 2 cách để connect db, rồi include nó quách vào tất cả các file cần query db, thế thôi, việc setup 1 trong 2 cách trên, đó là việc của network admin hoặc db admin, không phải là việc của web app developer hoặc system developer. Ở đây, bạn hình như nhầm lẫn về việc 1 php developer phải cấu hình mấy cái đó, đó là việc của db admin.

nhtuong
05-06-2007, 14:44
Ok, mặc dù chưa hiểu ý nhau lắm nhưng không sao! Tôi sẽ trở lại chủ đề tại sao MySQL có cái Unix Domain Socket trong một ngày gần đây. :canny:
Với bạn thì những việc này có vẻ rất dễ vì có thể bạn đang ở mức của những chuyên gia. Nhưng trong giới hạn kiến thức của tôi, tôi chỉ quan tâm ở mức coder, nếu tôi không cấu hình lại các biến môi trường MySQL trong php.ini thì tôi không thể nào kết nối đến database server theo qui cách không chính thống được. Cấu hình như thế nào? Đương nhiên manual có hướng dẫn! Nhưng xin thưa, nếu mọi người đọc manual mà làm được thì sẽ không có những cái 4rum như thế này! :byebye:

Miracle
06-06-2007, 15:08
Cấu hình cũng dễ thôi
Thêm mấy dòng sau vào file my.cnf

[client]
port= 3306
socket=/var/lib/mysql/mysql.sock

[mysqld]
socket=/var/lib/mysql/mysql.sock

toikhongtin
06-06-2007, 15:59
http://en.wikipedia.org/wiki/Internet_socket
An Internet socket (or commonly, a socket or network socket), is a communication end-point unique to a machine communicating on an Internet Protocol-based network, such as the Internet. (See RFC 147 for the original definition of socket as it relates to the ARPA network in 1971.)

An Internet socket is composed of the following:

* Protocol (TCP, UDP, raw IP)
* Local IP address
* Local port
* Remote IP address
* Remote port

The remote address can be either any valid IP address, or 0.0.0.0 for listening sockets and 255.255.255.255 for broadcasting sockets.

Operating systems combine sockets with a running process or processes (which use the socket to send and receive data over the network), and a transport protocol (i.e. TCP or UDP) with which the process(es) communicate to the remote host.

Usually sockets are implemented over TCP but this is not required. They can be implemented over any transport protocol, such as SNA [1]. The concept of a socket is an entity that implements an API, regardless of the implementation.

Two widely used Internet socket types are,

1. Datagram Sockets use UDP (User Datagram Protocol) for transmission. UDP is an unreliable, connectionless protocol.

2. Stream Sockets use TCP (Transmission Control Protocol), which is a reliable, connection-oriented protocol. TCP treats communications as a continuous stream of characters.

In contrast with the use of TCP connections directly, using sockets makes a distinction between client and server, and it is able to implement a queue of clients over a given server socket. Sockets usually are implemented by a library (as Berkeley sockets or Winsock).

Modern, Internet-enabled operating systems generally provide an implementation of the Berkeley Sockets API or Berkeley Sockets Layer, first introduced in 1983. Other socket API implementations exist, such as the STREAMS-based Transport Layer Interface (TLI).

By Cisco definition, "The combination of an IP address and a port number is referred to as a socket." P.480, ISBN 1-58713-150-1
http://en.wikipedia.org/wiki/Unix_domain_socket
A Unix domain socket (UDS) or IPC socket (inter-procedure call socket) is a virtual socket, similar to an internet socket that is used in POSIX operating systems for inter-process communication. The correct standard POSIX term is POSIX Local IPC Sockets.

These connections appear as a byte stream network connection but go from the local computer to itself.

In addition to sending data, processes can send file descriptors across a Unix domain socket connection using the sendmsg() and recvmsg() system calls.


Cho mình tham gia với, mấy hôm nay theo dõi topic này thấy xôm tụ quá. Sau khi lục lọi tìm tòi thì tôi đã trích dẫn ra cho các bạn xem để lấy đó thảo luận
Theo đó : Socket là một khái niệm mà nó sẽ thay đổi tên theo từng hệ điều hành, từng ngôn ngữ sử dụng, và kể cả theo từng lập trình viên
-unix domain socket (trong các hệ điều hành Linux hiện nay )
-winsock (trong windows)
-udp_socket....
Như vậy thì unix_domain_socket cuối cùng chỉ là một cái tên, cốt lõi ở chổ là nó vẫn là một socket theo đúng định nghĩ ban đầu.
Theo các tài liệu tìm được thì ta có thể thấy : khởi đầu Socket dùng để trao đổi dữ liệu giữa hai tiến trình (processus) ở hai máy. Trường hợp đặc biệt thì hai tiến trình trên cùng một máy.

nhtuong
06-06-2007, 17:41
Theo các tài liệu tìm được thì ta có thể thấy : khởi đầu Socket dùng để trao đổi dữ liệu giữa hai tiến trình (processus) ở hai máy. Trường hợp đặc biệt thì hai tiến trình trên cùng một máy.
Cuối cùng theo bạn Socket và Port có liên quan gì với nhau?

rcrackvn
06-06-2007, 18:35
Cho mình tham gia với, mấy hôm nay theo dõi topic này thấy xôm tụ quá. Sau khi lục lọi tìm tòi thì tôi đã trích dẫn ra cho các bạn xem để lấy đó thảo luận
Theo đó : Socket là một khái niệm mà nó sẽ thay đổi tên theo từng hệ điều hành, từng ngôn ngữ sử dụng, và kể cả theo từng lập trình viên
-unix domain socket (trong các hệ điều hành Linux hiện nay )
-winsock (trong windows)
-udp_socket....
Như vậy thì unix_domain_socket cuối cùng chỉ là một cái tên, cốt lõi ở chổ là nó vẫn là một socket theo đúng định nghĩ ban đầu.
Theo các tài liệu tìm được thì ta có thể thấy : khởi đầu Socket dùng để trao đổi dữ liệu giữa hai tiến trình (processus) ở hai máy. Trường hợp đặc biệt thì hai tiến trình trên cùng một máy.


Chào bạn:byebye:,
Mình có vài vấn đề muốn nói:

Socket là một khái niệm mà nó sẽ thay đổi tên theo từng hệ điều hành, từng ngôn ngữ sử dụng, và kể cả theo từng lập trình viên
-unix domain socket (trong các hệ điều hành Linux hiện nay )
-winsock (trong windows)
-udp_socket....


Bạn nhầm lẫn ở chỗ này, nếu bạn group chung winsock lại với unix domain socket và normal socket. Vì winsock KHÔNG PHẢI là socket, nó là network API (application programming interface) của win, nói nôm na, là library các hàm một network coder có thể sử dụng để interact với socket. Socket là thứ provide bởi kernel, network APIs là thứ "nằm giữa" kernel và network program. Cách phân biệt đơn giản: giả dụ win là open-source, bạn hoàn toàn có thể viết nên 1 lib như winsock để thay thế original winsock, nếu bạn đủ khả năng, mà không làm ảnh hưởng tới hoạt động của win kernel, nhưng bạn KHÔNG thể không thay đổi kernel nếu bạn muốn implement 1 loại socket mới thay cho 1 loại socket cũ.
Kế tiếp: do hiện tại, hầu hết các hệ điều hành đương đại đều viết từ C + 1 phần assembly, nên các socket implementation gần như toàn bộ viết bằng C. Nói xa hơn 1 chút, bạn là 1 programmer bình thường, chủ yếu những gì bạn viết là các program thuộc user-mode, bạn có thể học 1 course về PHP/Perl/Python/Java network programming, nhưng bạn nghĩ socket thay đổi theo ngôn ngữ là sai, vì tất cả bọn chúng chỉ là wrapper cho các system calls nằm bên dưới thôi, và system calls implement bằng C. Nói cách dễ hiểu là như thế này:
program -> API functions -> system call -> kernel

Do đó, có thể function bạn dùng để tạo 1 socket trong PHP, perl, python hay gì gì đó có tên khác nhau, nhưng cuối cùng cái code sau khi đã compile của bạn cũng chỉ làm 1 chuyện là invoke cái system call socket() thôi.


Như vậy thì unix_domain_socket cuối cùng chỉ là một cái tên, cốt lõi ở chổ là nó vẫn là một socket theo đúng định nghĩ ban đầu.


cái này thì mình đồng ý, mình cũng chưa từng đưa ra ý kiến nói rằng unix domain socket KHÔNG phải là socket.:sexy_girl:

ps: đừng quá trust vào những gì wikipedia định nghĩa, với tính chất của wikipedia là open, những định nghĩa đó chưa hẳn là chính xác/đầy đủ nhất về 1 vấn đề, bạn nên refer tới những tài liệu chuẩn của POSIX spec để có cái nhìn toàn diện hơn.

@nhtuong: mình không phải là experts hay gì gì hết, nhưng mình cũng có hứng thú chút ít, nên khi nào bạn quan tâm, bạn có thể tiếp tục thảo luận, rất vui khi đc biết bạn :byebye: