Ổ cắm TCP được thiết kế để có trạng thái vì vậy nói chung chúng được sử dụng để xác định các phiên. Các giao thức như SSH và ftp thực hiện chính xác điều này.
HTTP được thiết kế để không trạng thái và mỗi kết nối chỉ được liên kết với một tài nguyên sẽ được tải xuống. Sau khi tài nguyên được tải xuống ổ cắm TCP, yêu cầu HTTP sẽ được đóng lại. Lý do ban đầu cho điều này là sự đơn giản. Nhưng tác dụng phụ là các máy chủ HTTP chạy các trang web hiện đại có thể xử lý nhiều người dùng hơn nhiều so với các máy chủ dựa trên socket như SSH hoặc ftp.
Vì vậy, các socket không thể được sử dụng vì HTTP sẽ đóng socket sau khi tải xuống trang web.
Tất nhiên, việc nói HTTP sẽ đóng ổ cắm trên mỗi tài nguyên là quá đơn giản vì HTTP có các tính năng như đường ống và các kết nối liên tục có thể tải xuống nhiều tài nguyên trên mỗi ổ cắm. Nhưng đó chỉ là tối ưu hóa. Sau khi mọi thứ đã tải xuống, trình duyệt của bạn sẽ đóng ổ cắm sau một khoảng thời gian chờ.
HTTP ban đầu được thiết kế như một giao thức đơn giản để tải xuống các tệp HTML. Các trình duyệt cũ cũng có thể tải xuống các tệp HTML từ các giao thức khác như Gopher và ftp. Như vậy, không có lý do gì để tạo trạng thái HTTP vì các tệp HTML chỉ là các tệp văn bản đơn giản.
Khi các biểu mẫu web được giới thiệu và các trang HTML có thể gửi dữ liệu trở lại các trang web của máy chủ bắt đầu cần phiên. Do đó, cookie được tạo để giới thiệu lại trạng thái cho giao thức không trạng thái được truyền qua lớp chuyển trạng thái được truyền qua lớp mạng không trạng thái. Vì vậy, các lớp ứng dụng đầy đủ là:
- Ethernet, Wifi, vv = không trạng thái
- IP = không quốc tịch
- TCP = trạng thái
- HTTP = không trạng thái
- HTTP + cookie = trạng thái
Ngày nay, chúng tôi có các ổ cắm web có thể giữ một ổ cắm mở duy nhất từ trang web của bạn đến máy chủ. Vì vậy, với websockets, bạn có thể sử dụng lại socket để xác định người dùng bởi vì websocket tự nó là trạng thái. Nhưng trong hầu hết các trường hợp, bạn vẫn sẽ cần một cookie cho trang html chính tải javascript để khởi động websocket.