2008-12-14 29 views
10

Vì vậy, tôi đang làm rất nhiều lập trình mạng hiệu suất cao bằng cách sử dụng Boost :: Asio (hoặc chỉ Asio nếu bạn muốn), và có một nắm bắt khá vững chắc của các yếu tố cần thiết của cả hai giao thức TCP và UDP. Mặc dù vậy, tôi vẫn không tự coi mình là chuyên gia về mạng mặc dù kiến ​​thức của tôi là một cách hay để đóng khung các yếu tố cần thiết của những lập trình viên mạng nên biết, đặc biệt là những người cố gắng đẩy hiệu suất của mạng lớn của họ các ứng dụng?Mọi thứ mà nhà phát triển C++ nên biết về lập trình mạng?

Có một bài viết tuyệt vời về lập trình viên và những gì họ cần biết về bộ nhớ (xem bên dưới), vì vậy tôi tự hỏi liệu có ai đó đã đặt cùng một thứ gì đó tương tự cho mạng không.

What every programmer should know about memory

Trả lời

14

Một số điểm viên đạn ra khỏi đỉnh đầu của tôi về những điều bạn nên biết:

  • Làm thế nào và tại sao TCP hoạt động ... 3 chiều bắt tay, thừa nhận, trì hoãn ack, nagling, giao thức cửa sổ trượt. Có một lý do cụ thể cho mỗi một trong những tính năng đó ... và tất cả chúng có thể phá hủy hiệu suất của ứng dụng của bạn nếu được xử lý không đúng cách.
  • Phát đa hướng UDP ... ngay cả khi bạn không bao giờ nghĩ mình sẽ sử dụng nó, bạn cần phải biết lý do tại sao nó tồn tại để bạn có thể đưa ra quyết định giáo dục khi thiết kế hệ thống.
  • Phân mảnh IP và tác động của MTU.
  • Thứ tự nhị phân và thứ tự byte mạng (ngay cả khi bạn chỉ sử dụng bộ đệm proto của Google, thật thú vị khi hiểu được lý do tại sao chúng hiệu quả).
  • Sắp xếp theo thứ tự Ascii và khung tin nhắn (nghĩa là gì? Trong số \r\n\r\n có nghĩa là trong HTTP?)
  • Mô hình gửi I/O khác nhau: Theo dõi đơn luồng Apache, chuỗi sự kiện dựa trên sự kiện đề vv
  • Ảnh hưởng của các lỗ hổng tràn bộ đệm trong một ứng dụng mạng
  • thiết kế giao thức dựa, như trái ngược với API- hoặc thư viện dựa trên thiết kế
  • không đồng bộ vs giao thức đồng bộ. Nhiều hệ thống hiệu suất cao không đồng bộ. HTTP là đồng bộ, trừ khi bạn sử dụng pipelining, và thậm chí sau đó, có rất nhiều hạn chế về những gì có thể ... ví dụ như không có phản hồi out-of-order.

Cập nhật: Thiết kế dựa trên giao thức có nghĩa là gì?

Hãy xem xét HTTP, giao thức của web. Apache, IIS, Lighttpd, Firefox, Opera, WebKit, v.v ... Tất cả các phần mềm này đều nói HTTP. Hoàn toàn có thể là không ai trong số họ đang chia sẻ mã để làm như vậy. Nhược điểm, tất nhiên, là khả năng gia tăng của các lỗi do khối lượng ròng của mã. Có rất nhiều mặt tích cực:

  • Bất kỳ chương trình có thể giao tiếp thông qua HTTP, bất kể ngôn ngữ thực hiện
  • môi trường Lightweight/nhúng có thể chọn và chọn một tập hợp con của giao thức, hơn là sử dụng toàn bộ điều
  • Có thể để tối ưu hóa trình xử lý giao thức cho các tình huống cụ thể. Không thể tối ưu hóa thư viện mà không phải hy sinh tính tổng quát.
  • Một loạt các triển khai khác nhau buộc các nhà cung cấp thư viện giải quyết các lỗi (thay vì chỉ thổi chúng ra vì tất cả mọi người đều sử dụng cùng một thư viện).
  • Không có gánh nặng về tổ chức hoặc hợp đồng đối với người dùng HTTP, không có phí cấp phép.

Khi bạn thiết kế giao thức mạng, bạn có thể tự xây dựng một số API, mỗi API được điều chỉnh theo các trường hợp sử dụng cụ thể. Hoặc bạn có thể xây dựng một cái, tùy thuộc vào bạn. Các thành phần phần mềm được nối mạng có thể được nâng cấp độc lập với nhau. Về cơ bản, mọi thứ bạn nghe đều tốt về các lớp trừu tượng Java/C# Interfaces và C++, nhưng được áp dụng ở lớp mạng chứ không phải lớp ngôn ngữ lập trình.

+0

Xin cảm ơn, danh sách tuyệt vời. Bạn có thể mở rộng vào thời điểm này không? "Thiết kế dựa trên giao thức, trái ngược với thiết kế dựa trên API hoặc thư viện" – ApplePieIsGood

+0

Ah có bạn, điều đó có ý nghĩa tổng thể. Cảm ơn bạn đã làm rõ. Bất cứ đề nghị về nơi để đọc lên trên những điều này? Bên cạnh loạt sách TCP nhiều khối lượng, bất cứ điều gì một chút cô đọng hơn và hướng tới devs? – ApplePieIsGood

+0

Xin lỗi, tôi không thực sự biết bất kỳ tài liệu tham khảo nào cho điều này ... đó là tất cả các cốm tôi đã chọn trong công việc. – Tom

Các vấn đề liên quan