Chúng ta đã từng biết đến các web server trên các máy tính server lớn, bởi vì nó tương đối quen thuộc trong kỷ nguyên web hiện nay. Tuy nhiên,việc thực hiện một web server ngay trên hệ thống nhúng chỉ mới phát triển gần đây. Bởi vì việc thực hiện một server vốn chỉ có thể cài đặt trên các máy tính trước đây lên một hệ thống nhúng không hề đơn giản, nhất là hệ thống vi điều khiển.
Cùng với sự phát triển của các hệ thống nhúng, vi xử lý. Các ứng dụng trên internet cũng đã dần dần được tích hợp vào các hệ thống nhúng, hay ngay cả các hệ vi xử lý. Và một webserver nhúng điển hình nhất chúng ta hay gặp đó là các router kết nối ADSL gần như đã có mặt trong mỗi nhà đình.
Chúng ta hãy tưởng tượng, một thiết bị bé bằng bàn tay (hoặc nhỏ hơn) có khả năng kết nối với internet và đưa tất cả mọi thứ mà bạn muốn lên mạng internet, và từ đó cho phép bạn kiểm soát, điều khiển , đo đạc, quản lý... từ bất cứ đâu, từ bất cứ thiết bị nào, miễn là bạn có một kết nối internet, nó mở ra cho chúng ta một khái niệm mới về điều khiển, về quản lý và kể cả về cuộc sống, đó là cuộc sống bốn chiều (4D life). Trong cuộc sống đó, tất cả chúng ta sẽ sống trong môi trường thực, nhưng việc thu thập thông tin, việc tương tác giữa chúng ta lại thông qua một chiều khác, thế giới internet. Nó không giống với thế giới trước đây ta vẫn biết, đó là mọi thông tin ta có đều từ cuộc sống, mọi công việc ta làm đều là các thao tác trực tiếp, công việc quản lý đều phải thực hiện trực tiếp...
Quay trở lại với web server nhúng, đó là một thiết bị dựa trên hệ thống nhúng, hay hệ vi xử lý mà có thể giao tiếp được với internet ở cấp độ vật lý (kết nối với đường dây mạng hay wifi hay GPRS hay 3G ...) và đồng thời phải hỗ trợ được các giao thức mạng (internet protocol hay TCP/IP Protocol) cho phép chúng ta truy cập web, gởi mail,...
Các hệ thống như vậy thường sử dụng một Chip hỗ trợ bộ điều khiển ethernet/internet tích hợp với thư viện TCP/IP viết bằng C đi kèm, cho phép chúng ta tích hợp vào các hệ thống lớn hơn.
Các thự viện TCP/IP phải tuân thủ theo các tiêu chuẩn nghiêm ngặt quy định bởi cộng đồng phát triển hạ tầng mạng internet. Tuy nhiên, việc của chúng ta chỉ là tìm hiểu và sử dụng chúng như thế nào, chứ không cần quan tâm đến mã nguồn của chúng.
Hình sau mô tả vài thiết bị web server nhúng và một ứng dụng mô tả khả năng của chúng

Bộ giao thức TCP/IP
Bộ giao thức TCP/IP cho phép tất cả các hệ thống ở mọi kích thước, chạy mọi loại hệ điều hành khác nhau, hoặc chẳng chạy hệ điều hành nào cả, có thể giao tiếp với nhau thông qua một mạng kết nối chung. Dạng cơ bản nhất được gọi là worldwide Internet, một mạng diện rộng Wide Area Network (WAN) của hàng triệu máy tính.
Phân lớp của Bộ giao thức TCP/IP
Bộ giao thức TCP/IP bao gồm nhiều giao thức ở các lớp khác nhau (layers). Lý do người ta phải phân lớp giao thức vì nó cho phép thực hiện hiệu quả nhiệm vụ của từng lớp, với các mức độ phức tạp tăng dần theo đòi hỏi của các ứng dụng. Ví dụ như lớp mạng cho phép chúng ta thực hiện hiệu quả việc phân phối dữ liệu tới các địa chỉ mọng muốn trong một mạng một cách hiệu quả và chính xác. Nó giống như việc chúng ta phân cấp công việc theo từng cấp độ khác nhau, ví dụ người phát thư (lớp mạng) sẽ chỉ có công việc là phân phát thư đến đúng địa chỉ đã ghi mà không cần biết nội dung của chúng là gì . Còn chúng ta (cấp ứng dụng) sẽ là người tạo ra nội dung của bức thư và đóng gói chúng theo đúng tiêu chuẩn (protocol) của bưu điện ( tức là người đưa thư). Các phương tiện vận chuyển (máy bay, xe, tàu...) sẽ đóng vai trò như những lớp vật lý để vận chuyển thư của chúng ta tới đích, ở phía nhận, chúng ta cũng có quá trịnh tương tự, nhưng ngược lại.
Chú ý, ở mỗi lớp, chúng ta đều cần có một giao thức để hai lớp tương đương ở hai bên có thể hiểu nhau, ví dụ cả người gởi thư và người đọc thư phải sử dụng cùng một ngôn ngữ, hoặc cả hai bưu điện phát và nhận phải sử dụng cùng một giáo thức phân phát thư tín để tránh làm mất mát thông tin.
Mặt khác, giữa hai lớp gần nhau (tiếp xúc với nhau) phải có một giao diện trao đổi interface để hai lớp gần nhau có thể hiểu nhau, ví dụ giữa người gởi thư và người thu/phát thư phải sử dụng cùng một cách thức để không làm mất mát thông tin.
Mô hình TCP/IP thông thường bao gồm 4 lớp như hình sau :

Lớp ứng dụng (Application Layer)
Lớp ứng dụng điều khiển các ứng dụng chung chung bao gồm :
Ba lớp còn lại hoàn toàn không biết gì về ứng dụng mà chúng đang phục vụ, chúng chỉ đơn thuần hỗ trợ việc thông tin liên lạc giữa hai chương trình ứng dụng
Lớp vận chuyển (Transport Layer)
Lớp vận chuyển bao gồm hai lớp UDP và TCP ứng vói hai kiểu truyền dữ liệu là tin cậy và không tin cậy.
Lớp TCP cho phép truyền dữ liệu tin cậy giữa hai hosts, nó phải hõ trợ các cách thức kiểm soát dữ liệu, điều khiển luồng, kiểm soát lỗi , mất gói... và vì dữ liệu truyền đi được đảm bảo bởi lớp này, nên các lớp úng dụng không cần phải quan tâm đến việc kết nối, lỗi , mất dữ liệu...
Và vì vậy lớp TCP là tương đối phức tạp, vì nó phải đảm bao dữ liệu thông suốt giữa hai ứng dụng trong môi trường mạng rất phức tạp và không ổn định.
Lớp UDP thì đơn giản hơn, chúng chỉ có nhiệm vụ gởi gói tới nơi nhận mà không quan tâm đến việc chúng có tới nơi hay không, mặc dù mạng internet sẽ cố gắng hết sức đưa chúng tới nơi cần đến.
Chúng ta có thể xem như TCP giống như việc chuyển phát nhanh bảo đảm và UDP là chuyển phát nhanh không bảo đảm
Lớp mạng (Network Layer)
Lớp mạng thường được gọi là lớp internet (hay lớp IP - Internet Protocol). Nó điều khiển việc di chuyển các gói trong mạng, định tuyến các gói tin ... , giao thức IP và ICMP (Internet Control Message Protocol) sẽ cung cấp lớp mạng trong bộ giao thức TCP/IP Protocol Suite.
Lớp liên kết dữ liệu (Data-link Layer)
Lớp liên kết dữ liệu, hay còn gọi là lớp giao tiếp mạng ( Network Interface Layer ) là lớp chịu trách nhiệm giao tiếp với các card giao tiếp mạng (network interface card) hay các bộ điều khiển kết nối mạng (network controller). Chúng điều khiển trực tiếp phần cứng để chuyển dữ liệu ra các môi trường truyền vật lý như cáp mạng, wifi,3G...
Hình sau giới thiệu một ví dụ về hai host trong một mạng LAN (Local Area Network ) như Ethernet trao đổi dữ liệu sử dụng giao thức HTTP (một giao thức ở lớp ứng dụng).

Chúng ta chú ý rằng, trong mạng internet, mô hình trao đổi dữ liệu giữa hai ứng dụng thường gặp là môi trường client-server , nghĩa là một server sẽ lưu trữ dữ liệu và cung cấp một số dịch vụ cho phía client, và các client sẽ truy xuất để lấy dữ liệu về ứng dụng của mình, hoặc cập nhật dữ liệu lên server.
Thông dụng nhất là ứng dụng web, một web server (nằm trên máy chủ server hay các thiết bị web server nhúng) sẽ cung cấp các dịch vụ về web, trong trường hợp này, là cho phép các client truy xuất các trang web đặt trên web server. Trong khi đó các client (ví dụ web browser) sẽ truy xuất các web server theo giao thức http trên nền giao thức TCP. Mỗi lớp sẽ có một hoặc vài giao thức để liên lạc với cùng lớp đó phía bên kia. Thông thường chỉ có lớp ứng dụng là được thiết kế bởi người dùng, còn lại ba lớp kia thường được thực hiện bởi các thư viện, hay driver trong nhân của hệ điều hành.
Địa chỉ IP (IP address)
Thực chất TCP/IP chỉ là một giao thức mạng, nó giúp chúng ta giải quyết vấn đề truyền thông tin trong một môi trường mạng giúp cho hai ứng dụng có thể nối chuyện với nhau trong một môi trường trong suốt, như thể là chúng đang nối trực tiếp với nhau vậy.
Và vì vậy, vấn đề định địa chỉ trong một mạng là một trong những vấn đề cực kỳ quan trọng (nhất là trong các mạng lớn).
nếu các thiết bị được kết nối trực tiếp với nhau thông qua giao tiếp vật lý, chúng sẽ được định địa chỉ bởi các đại chỉ MAC (địa chỉ thực của phần cứng) hay còn gọi là địa chỉ ở lớp vật lý. Nếu các thiết bị được kết nối với nhau ở cấp độ lớp mạng, chúng phải được định địa chỉ bởi một địa chỉ khác, đó là địa chỉ mạng (địa chỉ IP). Về mặt lý thuyết, mỗi thiết bị giao tiếp với internet phải có một địa chỉ internet cố định và duy nhất . Và điều đó cho phép các ứng dụng trong mạng LAN có thể triển khai trên mạng internet mà không cần bất cứ thay đổi gì. Tuy nhiên, vì địa chỉ IP chỉ có 32-bit, trong khi số lượng các thiết bị giao tiếp với internet có thể lên tới con số hàng tỷ tỷ. Do đó đã nảy sinh ra nhiều vấn đề rắc rối, để giải quyết vấn đề đấy, người ta chia địa chỉ IP ra thành các lớp khác nhau, và sử dụng các kỹ thuật như NAT port... cho phép nhiều máy tính cùng sử dụng một địa chỉ IP mà không làm ảnh hưởng đến sự trao đổi dữ liệu, cũng như không cần phải thay đổi giao thức TCP/IP (ví dụ như mở rộng thành IPv6) .
Hình sau chỉ ra cấu trúc và phân lớp của đại chỉ IP :

Các địa chỉ internet được quản lý bởi tố chức Internet Network Information Center (NIC)
Hình sau chỉ ra tầm của các lớp địa chỉ IP.

Địa chỉ IP có thể phân ra làm ba loại :
Số hiệu cổng (Port number)
Với các hệ đa nhiệm, nhiều chương trình có thể cùng chạy các ứng dụng mạng khác nhau, do đó bộ giao thức TCP/IP phải có khả năng hỗ trợ nhiều ứng dụng cùng lúc. Và số hiệu cổng dùng để xác định ứng dụng nào đang tạo ra dữ liệu, và ứng dụng nào sẽ nhận dữ liệu. Số hiệu cổng là một số 16bit nằm trong header của gói tin TCP hoặc UDP, và dùng để xác nhận ứng dụng nào đang gởi dữ liệu vàứng dụng nào sẽ nhận dữ liệu. Vì vậy trong phần header của gói tin của UDP và TCP sẽ có số hiệu cổng nguồn (source port number) và số hiệu cổng đích (destination port number). Một số các ứng dụng nổi tiếng (như http server hay web server telnet server ... đều có số hiệu cổng riêng để tránh trùng lặp với các ứng dụng khác). Hầu hết các c63ng < 1024 đều đã có các ứng dụng riêng, và việc quy định chúng được quản lý bởi tổ chức IANA (the Internet Assigned Numbers Authority). Và chúng ta phải tuân theo nếu muốn giao tiếp với cả thế giới. Dĩ nhiên ta hoàn toàn có thể tự quy định các cổng này và sử dụng chúng trong bất kỳ mục đích nào và ứng dụng nào, nếu muốn, miễn là chỉ trong mạng nội bộ của chúng ta, tuy nhiên điều đó là không nên, vì chúng ta cũng còn khá nhiều cổng khác chưa được đang ký và có thể sử dụng.
Thông thường, client không quan tâm nhiều đến số hiệu cổng mà nó sử dụng, nó chỉ cần biết là port đó chưa có ai dùng là được, bởi vì client chỉ dùng port khi người dùng chạy chương trình client, sau khi chạy xong, nó sẽ trả lại cổng đó cho hệ thống, trong khi đó, các server phải hoạt động liên tục để chờ các yêu cầu từ client, do đó chúng cần các cổng có số hiệu cố định và được biết đến bởi tất cả các client, cũng giống như là địa chỉ của cơ quan công an thì phải rõ ràng và không được thay đổi để bất kỳ người dân khi cần có thể tới địa chỉ đấy, trong khi người dân thì không cần phải có địa chỉ cố định.
Việc phân biệt giữa đại chỉ IP và số hiệu cổng cũng gần giống như địa chỉ khách sạn trong một thành phố và địa chỉ phòng trong khách sạn đấy vậy.
Sự kết hợp giữa địa chỉ IP và một số hiệu cổng thường được gọi là socket.
Đóng gói dữ liệu (Encapsulation)
Khi dữ liệu được ứng dụng gởi thông qua TCP, dữ liệu sẽ được gởi qua từng lớp của bộ giao thức TCP/IP tới khi chúng thành các chuỗi bit truyền đi trogn mạng, mỗi lớp sẽ chịu trách nhiệm một công việc riêng như định tuyến, chia thành nhiều gói nhỏ, kiểm soát luồng, kiểm soát lỗi,... Và vì vậy, chúng phải thêm thông tin vào các gói tin, gọi là các header và trailers ở đầu và đuôi của dữ liệu. Nó cũng giống như việc ta gởi thư, ta chỉ việc soạn nội dung bức thư, thư ký của chúng ta :) sẽ bỏ vô phong bì, và dán tem lại, ghi thêm các thông tin cần thiết như địa chỉ người gởi, người nhận... và bỏ vào thùng thư. Nhân viên đưa thư sẽ bỏ thư vào một gói lớn hơn, thêm các thông tin theo tiêu chuẩn của bưu điện... cũng dễ hiểu phải không nhỉ.
Chỉ có một điều chúng ta cần nhớ là header của lớp này và dữ liệu của lớp trên nó, cũng đều được đối xử như là dữ liệu của lớp dưới nó.
hình sau chỉ ra quá trình này một cách cụ thể :

Một vài thuật ngữ cần phải giải thích:
• TCP segment: là một đơn vị dữ liệu của lớp TCP gởi xuống cho lớp IP.
• IP datagram: Là đon vị dữ liệu mà lớp IP sẽ gởi vào mạng.
• Frame: là chuỗi byte mà thực sự truyền trong môi trường vật lý ethernet.
• TCP segment: là một đơn vị dữ liệu của lớp TCP gởi xuống cho lớp IP.
• IP datagram: Là đon vị dữ liệu mà lớp IP sẽ gởi vào mạng.
• Frame: là chuỗi byte mà thực sự truyền trong môi trường vật lý ethernet.
Ngoài các dữ liệu mà ứng dụng gởi đi cho nhau, bộ giao thức TCP/IP cũng tự động gởi đi các gói tin để xác định tình trạng mạng, quản lý các thông tin mạng... ví dụ như các gói tin ARP/RARP...
Đối với mỗi header của các lớp, ví dụ IP header, chúng sẽ chèn vào các thông tin để giải quyết các vấn đề mà lớp đó phải chịu trách nhiệm. Việc quy định các thông tin (hay còn gọi là các field) trong các header tạo nên cái gọi là giao thức của lớp đó. Nghĩa là giao thức của một lớp nào đó đơn giản chỉ là việc duy định định nghĩa các trường (fields) trong header mà chúng thêm vào dữ liệu . Tuy nhiên việc định nghĩa đấy không hề đơn giản :), nhưng công việc của chúng ta chỉ là học chúng và thực hiện cho phù hợp với các quy định đó.
Tiếp theo chúng ta hãy cùng nghiên cứu qua các header của các lớp như lớp IP, lớp UDP, lớp TCP. Sau đó sẽ phân tích toàn bộ quá trình hoạt động của một web server (hay http server) dựa trên những kiến thức mà ta đã trình bày ở đây.
IP : Internet Protocol (Giao thức Internet)
Lớp IP là nền tảng của tất cả các dịch vụ internet, nó đảm bảo việc truyền thông tin giữa các node trong mạng, các giao thúc cao hơn như TCP và UDP chỉ là những giao thức cần thiết để hình thành các lớp ứng dụng. Hiện nay hầu hết tất cả các dịch vụ ngoài internet như thoại, video, television... đều đã dần chuyển sang mạng IP (VoIP, IPTV,...).Do vậy, tìm hiểu về IP là mang tính bắt buộc và có nhiều ý nghĩa cho những nghiên cứu sau này.
Các giao thức TCP, UDP và ICMP đều truyền dữ liệu dựa trên mạng IP dưới dạng các gói tin IP (datagram). Mạng IP cung cấp một dịch vụ phân phối gói dữ liệu phi kết nối (connectionless) , và không tin cậy theo cơ chế Best Effort (Cố gắng tối đa). Không tin cậy ở đây mang hàm ý là không có gì bảo đảm rằng gói tin IP sẽ đến đúng nơi cần đến. Khi có lỗi sảy ra, giao thức IP chỉ có một thuật toán điều khiển lỗi khá đơn giản là : hủy dữ liệu vàco61 gắng gởi một gói tin ICMP ngược trở về nguồn để thông báo về lỗi đã xảy ra. Nhưng trớ trêu là cũng chẳng có gì đảm bảo là gởi tin ICMP này sẽ đến được nơi cần đến.
Như vậy các dịch vụ yêu cầu mức độ tin cậy cao sẽ phải được thực hiện ở các lớp cao hơn. Nó giống như việc đảm bảo dữ liệu không mất mát trong một môi trường không ổn định bằng cách áp dụng các kỹ thuật ở lớp cao hơn như thiết lập kết nối, gởi lại gói, sửa lỗi,....
Còn thuật ngữ phi kết nối có nhắc đến ở trên có nghĩa rằng giao thức IP không thiết lập bất cứ một con đường vận chuyển dữ liệu nào cố định, nó đơn thuẩn đẩy gói dữ liệu ra khỏi mạng với địa chỉ đích đến, các node định tuyến sẽ thực hiện các giải thuật để đưa chúng tới nơi cần đến, và vì các giải thuật định tuyến này là độc lập nhau , do đó các gói tin IP có thể phân phát không theo một trật tự nào cả.
Ví dụ, ta có một gói hàng (dữ liệu) cần vận chuyển từ nam ra bắc bằng tuyến xe bus.Vì kích thước giới hạn, gói hàng phải phân ra thành các gói hàng nhỏ hơn (gói dữ liệu IP), và mỗi gói sẽ đánh số thứ tự và ghi địa chỉ nguồn và địa chỉ đích, mỗi gói hàng ta sẽ giao ra bến xe bus, các gói hàng sẽ được gởi theo các tuyến xe bus khác nhau tùy thời điểm mà chúng gởi ra bến (node mạng) và tùy tình trạng giao thông (traffic network) ,... như thế mỗi gói sẽ trải qua các hành trình khác nhau, cho tới điểm đích đến cuối cùng, dĩ nhiên trên đường đi chúng có thể bị mất mát mà không ai phải chịu trách nhiệm nào cả, và có những lúc, gói tin gởi trước lại đến sau gói tin gởi sau, bởi vì tình trạng mạng là không thể xác định.
IP Header
Hình sau đây chỉ ra đ5inh dạng của một gói tin IP. Kích thước của phần IP header chèn thêm vào gói dữ liệu là 20 bytes, trừ khi có thêm các option.
bit có trọng số cao nhất là bit đánh số 0 ở bên trái, bit có trọng số thấp nhất là bit thứ 31 bên tay phải.lần lượt 4 byte của giá trị 32-bit sẽ được truyền ra mạng theo thứ tự : bits 0 - 7, sau đó bits 8 - 15 và tiếp tục. Đây gọi là trật tự byte kiểu Big-Endian (ta còn có kiểu Little-Endian theo thứ tự ngược lại).
các trường trong IP headerđược mô tả như sau :

Version : Phiên bản hiện tại của IP là 4, vì vậy IP thường được gọi là IPv4.
Header Length là tổng số lượng 32-bit words (4 bytes / 1 word) trong phần header, tính cả phần Options. Thường giới hạn không quá 60 bytes (max : 15*4=60).
Type-of-service (TOS) Là một trường 8 bit, định nghĩa chất lượng dịch vụ, bao gồm các bit như : minimize delay, maximize throughput, maximize reliability và minimize monetary cost. Chỉ 1 trong 4 bit này có thể bật lên 1.Nếu cả 4 bits đều là 0, nó sẽ phục vụ ở mức độ bình thường. Mặc dù ta có thể set các bit này để ưu tiên các gói dữ liệu của ta, tuy nhiên sự ưu tiên thực sự có xảy ra hay không còn phụ thuộc vào các nhà mạng cung cấp cơ sở hạ tầng mạng internet. Vì dụ như, chúng ta thuộc diện nghèo, được ưu tiên giảm học phí, tuy nhiên trong thực tế, không phải lúc nào ta cũng được hưởng sự ưu tiên đấy, điều đó cũng dễ hiểu, nhất là trong những môi trường mang tính công cộng như internet, để đảm bảo được sự ưu tiên thực sự, các bạn phải có sự ký kết với phía cung cấp hạ tầng mạng kèm thao các khoản chi phí nhất định.
Total Length Trường này thể hiện tThis is the total length of the IP datagram in bytes. Using this field and the header length field, we know where the data portion of the IP datagram starts and its length. Since this is a 16-bit field, the maximum size of an IP datagram is 65535 bytes.
Identification This field uniquely identifies each datagram sent by a host. It normally increments by
one each time a datagram is sent.
Time-to-live Time-to-live sets an upper limit on the number of routers through which datagram can pass. It limits the lifetime of the datagram. It is initialized by the sender to some value (often 32 or 64) and decrements by one in every router that handles the datagram.
When this field reaches 0, the datagram is discarded, and the sender is notified with an ICMP message. This prevents the packet from getting caught in eternal routing loops.
When this field reaches 0, the datagram is discarded, and the sender is notified with an ICMP message. This prevents the packet from getting caught in eternal routing loops.
Protocol Protocol is used by IP to demultiplex incoming datagrams. It identifies which protocol
gave the data for IP to send.
gave the data for IP to send.
Header Checksum The Header checksum is calculated over the IP header only. It does not cover any data
that follows the header. ICMP, UDP and TCP all have a checksum in their own headers to cover their own header and data.
Source IP address và the destination IP address Every IP datagram contains the source IP address and the destination IP address.
These are 32-bit values.
The Option Field This is a variable-length list of optional information for the datagrams. The options are rarely used and not all hosts and routers support the option.
Hoàng Nguyễn (biên soạn)















