Đầu mối giúp gửi và nhận message giữa tầng ứng dụng và vận chuyển là socket. Mọi socket đều thuộc về một tiến trình (process) nào đó. Một tiến trình có thể có nhiều socket.
Giữa các máy, các socket được phân biệt dựa trên địa chỉ IP. Trong cùng một máy, các socket được phân biệt dựa trên port number (số cổng).

Như vậy, có thể xem các socket như các cánh cửa. Và tòa chung cư là một tiến trình. Khi chúng ta cần gửi một bức thư (gói tin) đến một người (một tiến trình nào đó), ta cần gửi nó qua cánh cửa (socket) đến chỗ người giao thư.
Người giao thư sẽ căn cứ địa chỉ có trên bì thư (IP và port number) để vận chuyển đến cánh cửa của người nhận. Bên cạnh đó, một căn hộ có thể có nhiều cánh cửa (một tiến trình có thể có nhiều socket).
Socket là giao diện giữa tầng ứng dụng và tầng vận chuyển. Thông thường, người lập trình ứng dụng mạng ít có khả năng tác động đến tầng vận chuyển.

Socket Programming
Lập trình socket có thể dựa trên một trong hai giao thức: TCP hoặc UDP.
UDP Socket
Nếu sử dụng UDP thì không cần thiết lập kết nối trước. Bên gửi gắn địa chỉ IP và port vào mỗi packet. Bên nhận phân tách địa chỉ IP và port từ packet.
Attention
Lưu ý là chỉ cần hai bên cùng tồn tại socket thì có thể gửi dữ liệu được với nhau, không cần bắt buộc socket bên nào phải tạo trước.
Luồng thực thi của UDP socket giữa client và server (sử dụng ngôn ngữ Python):

Tip
Port không nên được fix cứng, vì nếu trùng nhau thì sẽ có thể không tạo được socket giữa các lần tạo do port đó đã được sử dụng rồi.
Nếu hai máy khác nhau có hai process khác nhau, hai process đó vẫn sẽ có thể trùng port. Tuy nhiên nếu hai process chung một máy thì không thể trùng port.
TCP Socket
Nếu socket sử dụng giao thức TCP, client buộc phải tạo kết nối trước với server.
Đối với mỗi client kết nối đến sever, server cần phải tạo ra một socket mới với port riêng biệt. Nếu có mười client thì server cần tạo ra mười socket để giao tiếp với mười client đó.
Attention
Bắt buộc server phải tạo ra socket trước để có thể thiết lập kết nối với client.