Khái niệm socket, Winsock, lập trình socket | Tự học ICT

Trong bài học này chúng ta sẽ xem xét vấn đề trung tâm của lập trình mạng: socket.
Trong các bài học trước chúng ta đã xem xét chi tiết các vấn đề của ứng dụng mạng. Tất cả các vấn đề đó giúp chúng ta định hình vị trí của ứng dụng mạng trong toàn hệ thống.
Để tạo ra ứng dụng mạng chúng ta phải sử dụng đến socket giúp ứng dụng tương tác với dịch vụ mạng của hệ thống.

Khái niệm Socket

Lập trình với socket là nền tảng cho việc tăng trưởng toàn bộ những loại ứng dụng có sử dụng dịch vụ truyền thông online mạng, được cho phép tất cả chúng ta sử dụng những dịch vụ truyền thông online mạng mà mạng lưới hệ thống phân phối. Trong phần này tất cả chúng ta sẽ xem xét chi tiết cụ thể khái niệm và vị trí của socket .

Như đã học trong các bài trước, các ứng dụng mạng đều bao gồm các cặp tiến trình và quá trình truyền thông giữa chúng. Bất kỳ thông điệp nào truyền đi từ một tiến trình tới tiến trình còn lại phải đi qua mạng. Dữ liệu từ tiến trình tới dịch vụ truyền thông phải đi qua một đối tượng trung gian gọi là socket.

Góc nhìn truyền thông online

Khi nhìn nhận từ góc nhìn tiếp thị quảng cáo ( đường đi của thông tin ), socket hoàn toàn có thể được tưởng tượng như thể một cánh cửa ngăn cách giữa chương trình ứng dụng ( thuộc toàn quyền của người lập trình ) và ngăn xếp giao thức mạng ( thuộc quyền quản trị của hệ quản lý ) .Dữ liệu do chương trình tạo ra đi xuyên qua cánh cửa này để đến quốc tế mạng, nơi nó sẽ được truyền tới nơi cần đến. Ở chiều ngược lại, tài liệu từ mạng hoàn toàn có thể đi xuyên qua cánh cửa này để tới được chương trình, nơi nó sẽ được giải quyết và xử lý .Đường đi của dữ liệu từ ứng dụng qua socket tới mạngĐường đi của dữ liệu từ ứng dụng qua socket tới mạngMột khi tài liệu đã đi xuyên qua cánh cửa này, người lập trình sẽ không trấn áp được nữa mà trọn vẹn do những giao thức mạng nhào nặn để làm thế nào hoàn toàn có thể truyền đi qua mạng một cách tốt nhất. Người lập trình chỉ có năng lực lựa chọn loại dịch vụ luân chuyển tài liệu theo nhu yếu. Cụ thể hơn người lập trình chỉ hoàn toàn có thể lựa chọn dịch vụ TCP hoặc dịch vụ UDP, đồng thời phân phối tham số để những dịch vụ này phục vụ việc luân chuyển tài liệu theo nhu yếu của mình .

Góc nhìn quy mô mạng

Nhìn từ ứng dụng, socket là giao diện giữa ứng dụng và dịch vụ tầng giao vận trên mỗi máy. Trong quy mô mạng TCP / IP, socket hoàn toàn có thể xem như giao diện giữa tầng ứng dụng và tầng chuyển vận .Người tăng trưởng ứng dụng có toàn quyền trấn áp phía tầng ứng dụng của socket nhưng không hề trấn áp phía tầng giao vận của socket. Ở phía tầng giao vận, người tăng trưởng ứng dụng chỉ hoàn toàn có thể lựa chọn giao thức của tầng này và kiểm soát và điều chỉnh một vài tham số ( kích cỡ tối đa của bộ nhớ đệm, kích cỡ tối đa của những segment dữ liệu ) .Quan hệ tiến trình - socket - dịch vụ TCP trên thiết bị đầu cuốiQuan hệ tiến trình – socket – dịch vụ TCP trên thiết bị đầu cuốiTrong hai cách nhìn nhận trên, socket đóng vai trò điểm đầu và điểm cuối của quy trình tiếp thị quảng cáo mạng, cũng như phân tách giữa tiến trình ( chương trình ứng dụng ) và dịch vụ luân chuyển của mạng .So sánh một cách hình tượng, mỗi tiến trình hoàn toàn có thể so sánh với một ngôi nhà, còn socket chính là cửa của ngôi nhà đó, và thiên nhiên và môi trường mạng truyền tài liệu tương tự như như một dịch vụ chuyển phát nhanh đặt ở ngay cửa của ngôi nhà .

Góc nhìn lập trình

Đối với người lập trình ứng dụng, socket hoàn toàn có thể được tưởng tượng là một giao diện lập trình ứng dụng ( API ) để gọi tới những chương trình con của hệ quản lý .Trong những bài trước tất cả chúng ta đã nhắc tới giao thức TCP hay giao thức UDP. Về thực chất, TCP hay UDP đều là những chương trình được tích hợp sẵn trong những hệ quản lý tân tiến .Tương tự như những chương trình mạng lưới hệ thống khác, TCP hay UDP ( và cả IP ) cũng phân phối API để người lập trình hoàn toàn có thể sử dụng được những chương trình này .Khi học lập trình socket, tất cả chúng ta sẽ nhìn nhận khái niệm socket đa phần theo góc nhìn này. Việc học lập trình socket khi đó thực ra là việc học thao tác với những API của mạng lưới hệ thống để gọi những dịch vụ truyền thông online .Socket API tiên phong được thiết kế xây dựng bởi ĐH Berkeley cho hệ điều hành quản lý BSD nên thường được gọi là BSD socket hay Berkeley socket. Sau đó Microsoft tìm hiểu thêm và tạo ra những socket API dành cho hệ quản lý và điều hành windows, gọi là windows socket, hay thường gọi tắt là winsock .Winsock là bộ API tiêu chuẩn để lập trình mạng trong windows. Cũng vì nguyên do này mà những hàm socket API trên những hệ điều hành quản lý lúc bấy giờ đều có tên gọi gần giống nhau. Nắm bắt được cách lập trình với socket API trên một nền tảng này hoàn toàn có thể thuận tiện tiếp cận với những nền tảng khác .

Phân loại socket

Do có 2 loại dịch vụ tương hỗ trao đổi tài liệu qua mạng như đã nói, socket cũng được chia làm 2 loại hầu hết :

  1. Socket để sử dụng dịch vụ TCP, gọi là TCP socket:
    Bởi vì TCP cung cấp dịch vụ truyền dữ liệu theo một liên kết ảo giữa hai tiến trình, TCP socket còn được gọi là socket hướng kết nối (connection-oriented socket). Do dữ liệu truyền theo liên kết TCP được hình dung như một chuỗi byte liên tục, loại socket này còn có một tên gọi khác là socket hướng dòng (stream socket).
  2. Socket để sử dụng dịch vụ UDP, gọi là UDP socket:
    Do UDP không tạo liên kết mà truyền dữ liệu theo các gói (datagram) độc lập, UDP socket được còn được gọi là socket phi liên kết (connectionless socket) hay dgram socket.

Đối với người tăng trưởng ứng dụng mạng lưới hệ thống còn một loại socket nữa, gọi là socket thô ( raw socket ). Loại socket này được cho phép gọi thẳng đến chương trình IP mà bỏ lỡ TCP hoặc UDP .Bình thường, tài liệu sau khi đến chương trình IP sẽ được chuyển tiếp lên chương trình TCP hay UDP, sau đó mới được chuyển tới ứng dụng. Khi sử dụng socket thô, ta hoàn toàn có thể bỏ lỡ TCP / UDP mà trực tiếp nhận gói tin “ thô ” từ IP. Loại socket này giúp tất cả chúng ta tăng trưởng 1 số ít ứng dụng đặc biệt quan trọng như ping, trace route .

Lập trình socket

Các hệ quản lý và điều hành tiên phong của Microsoft ( như MS-DOS và những phiên bản đầu của Microsoft Windows ) có phân phối năng lực liên kết mạng nhưng rất hạn chế, hầu hết dựa trên NetBIOS. Trên trong thực tiễn, tại thời gian đó, Microsoft không cung ứng tương hỗ cho ngăn xếp giao thức TCP / IP .Một số nhóm và nhà cung ứng thương mại ( như nhóm PC / IP tại MIT, FTP Software, Sun Microsystems, Ungermann-Bass và Excelan ) đã ra mắt những loại sản phẩm TCP / IP cho MS-DOS, ở dạng một bộ phận của gói phần cứng / ứng dụng. Khi Windows 2.0 được phát hành, 1 số ít nhóm khác ( như Distinct và NetManage ) cũng tham gia cung ứng TCP / IP cho Windows .Một yếu tố rất lớn gặp phải là mỗi nhà cung ứng lại sử dụng bộ API của riêng mình mà không có một quy mô lập trình tiêu chuẩn thống nhất. Đến năm 1991, Martin Hall của JSB Software ( sau này đổi tên thành Stardust Technologies ) đề xuất kiến nghị Windows Sockets API và trở thành tiêu chuẩn cho lập trình ứng dụng mạng trong Windows .

Winsock

Windows Sockets API ( WSA ), sau rút gọn thành Winsock, là một đặc tả kỹ thuật xác lập cách ứng dụng mạng trong Windows truy vấn những dịch vụ mạng, đặc biệt quan trọng là TCP / IP. Winsock định nghĩa giao diện chuẩn giữa ứng dụng ( ví dụ chương trình FTP client hoặc trình duyệt web ) và ngăn xếp giao thức TCP / IP bên dưới. Winsock API được đặt trong file winsock.dll ( 16 bit ) hoặc wsock32.dll ( 32 bit ) trong thư mục mạng lưới hệ thống .Windows Sockets định nghĩa hai giao diện :

  1. API cho các nhà phát triển phần mềm ứng dụng, và SPI cho các nhà phát triển phần mềm hệ thống (để thêm các giao thức mới vào hệ thống). API đảm bảo cho ứng dụng có thể hoạt động với cài đặt của giao thức (protocol implementation) từ bất kỳ nhà cung cấp phần mềm mạng nào.
  2. SPI đảm bảo cho một cài đặt của giao thức phù hợp có thể được thêm vào hệ thống Windows, và nếu một ứng dụng tuân thủ API thì có thể sử dụng được giao thức mới. Tuy nhiên, hiện nay SPI rất hiếm được sử dụng do trong tất cả các phiên bản Windows gần đây, Microsoft đã hỗ trợ đầy đủ ngăn xếp giao thức TCP / IP và không có nhiều người quan tâm xây dựng các giao thức khác với TCP / IP.

Code và phong cách thiết kế của Windows Socket dựa trên tìm hiểu thêm BSD Socket và cung ứng tính năng bổ trợ để API tuân thủ theo quy mô lập trình Windows. Windows Sockets API gồm có gần như toàn bộ những tính năng của BSD Socket API. Do đó, khi nắm được kỹ thuật lập trình với một bộ socket API hoàn toàn có thể thuận tiện tiếp cận với những bộ socket API khác .

Ngoài ra, nhiều công cụ phát triển phần mềm ứng dụng hiện đại cũng tạo ra các “vỏ bọc” (wrapper) riêng xung quanh bộ socket API để đơn giản hóa và nâng cao hiệu quả trong phát triển các phần mềm ứng dụng mạng.

Hạn chế của lập trình winsock

Như trên vừa trình diễn, winsock là bộ API tiêu chuẩn để lập trình mạng trong windows. Tuy nhiên, việc lập trình ứng dụng với winsock có những khó khăn vất vả nhất định .Thứ nhất, những API mạng lưới hệ thống thường rất phức tạp với rất nhiều tham số gây khó khăn vất vả cho việc lập trình. Để bảo vệ tính linh động, mỗi API đều chứa rất nhiều tham số, sử dụng nhiều kiểu tài liệu tương hỗ, cũng như có rất nhiều loại “ magic constant ”. Lập trình với socket API cũng không ngoại lệ .Thư hai, việc gọi đến những API của mạng lưới hệ thống thường chỉ tương thích khi lập trình với một số ít ngôn từ và công nghệ tiên tiến nhất định. Ví dụ khi sử dụng C / C + + / Delphi thiết kế xây dựng ứng dụng native cho windows sẽ thuận tiện truy vấn những API này hơn. Tuy nhiên, sử dụng những ngôn từ và công cụ bậc “ không cao ” như C / C + + làm tăng thời hạn tăng trưởng ứng dụng ( giảm hiệu suất ) .Các công nghệ tiên tiến tăng trưởng ứng dụng tân tiến thường hạn chế việc truy xuất trực tiếp đến những API của mạng lưới hệ thống. Thay vào đó, những công nghệ tiên tiến này thường tạo ra những “ vỏ bọc ” ( wrapper ) để giúp người lập trình gọi đến những API của mạng lưới hệ thống một cách thuận tiện hơn .Ví dụ, trong công nghệ tiên tiến windows form của. Net framework, thay vì để người dùng trực tiếp gọi tới những API để vẽ ra giao diện đồ họa ,. NET tạo ra những wrapper xung quanh những API này ,. NET sau đó sẽ giúp người dùng gọi những API tương ứng để vẽ ra giao diện đồ họa .

Lập trình socket trong. NET framework

Đối với socket API ,. NET framework cũng tạo ra những lớp wrapper để giúp người lập trình gọi những hàm của TCP hay UDP mà không cần tiếp xúc trực tiếp với socket API. Qua đó giúp người lập trình liên tục sử dụng quy mô lập trình mạnh, đơn thuần, hiệu suất cao của. NET framework trong việc lập trình tiếp thị quảng cáo .. NET framework cũng có những tương hỗ khác ( không riêng ) cho lập trình mạng, gồm có : giao diện luồng tài liệu ( stream ), trình tự hóa dữ liệu ( serialization ), đổi khác tài liệu ( data conversion ), lập trình bất đồng bộ ( asynchronous programming ), lập trình đa luồng ( multi-threading programming ), tạo bộ đệm ( caching ), bảo mật thông tin ( socket security, crypto-stream ) .Các tương hỗ này đóng vai trò đặc biệt quan trọng quan trọng khi kiến thiết xây dựng thành phần server và thiết lập giao thức. Tất cả những yếu tố này sẽ lần lượt được trình diễn chi tiết cụ thể trong những bài học kinh nghiệm tương ứng của tài liệu .Trong khuôn khổ bài giảng này, tất cả chúng ta sẽ chỉ điều tra và nghiên cứu cách lập trình socket trên. NET framework với ngôn từ C #. Các nguyên tắc cơ bản của lập trình socket là tương tự như nhau mặc dầu sử dụng những công cụ khác nhau. Nắm bắt được cách lập trình socket trên. NET hoàn toàn có thể trọn vẹn thuận tiện tiếp cập lập trình socket, ví dụ, trên Java, hay Python, Rubi, v.v. .Lưu ý rằng đây là một tài liệu chuyên về lập trình mạng với. NET framework, không phải là một tài liệu về lập trình C #. Chúng ta sẽ không đề cập đến những yếu tố cơ bản của lập trình C # ở đây. Để hoàn toàn có thể theo dõi những ví dụ của bài giảng, những bạn cần nắm vững ngôn từ lập trình C #, kỹ thuật lập trình hướng đối tượng người dùng trong C #, cách lập trình với những thư viện của. NET framework, cũng như một số ít kỹ thuật lập trình. NET nâng cao .

Một số yếu tố trong lập trình mạng

Khi nào cần lập trình socket ?

Mặc dù lập trình socket là nền tảng trong tăng trưởng ứng dụng mạng, sử dụng nó cũng có những điểm yếu kém nhất định .Khi sử dụng socket, bạn đang thao tác với dịch vụ Tcp hoặc Udp của mạng lưới hệ thống để gửi và nhận tài liệu. Để đạt được hiệu suất cao, bạn bắt buộc phải thiết kế xây dựng một giao thức riêng của mình ( được tính là giao thức thuộc tầng ứng dụng ). Tạo ra những giao thức tầng ứng dụng không phải là một việc làm đơn thuần, đặc biệt quan trọng nếu ứng dụng của bạn có những nhu yếu cao về mặt truyền thông online ( ví dụ, so với game trực tuyến ) .Khi lập trình socket, bạn được ( và phải ) trấn áp trọn vẹn tiến trình tiếp thị quảng cáo và tài liệu. Đây là một con dao hai lưỡi với người lập trình, nhất là khi bạn không có nhiều kiến thức và kỹ năng về mạng máy tính và tiếp thị quảng cáo .Lập trình socket được sử dụng nếu ứng dụng của bạn có những nhu yếu đặc biệt quan trọng về truyền thông online mà không có những giao thức hoặc công cụ cấp cao tương hỗ .Khi bạn cần lập trình ứng dụng để nhận tài liệu từ những thiết bị cảm ứng, hoặc lập trình để điều khiển và tinh chỉnh thiết bị, v.v., đây là lúc phải dùng đến lập trình socket. Khi bạn cần kiến thiết xây dựng một ứng dụng mạng đặc biệt quan trọng của riêng mình, ví dụ, một chương trình chat đơn thuần hoạt động giải trí trong LAN, lập trình socket là một công cụ tốt .

Các công nghệ tiên tiến tương hỗ tăng trưởng ứng dụng mạng

Để đơn giản hóa việc tăng trưởng ứng dụng mạng, nhiều công nghệ tiên tiến lập trình tương hỗ thao tác với những giao thức tầng ứng dụng phổ cập như HTTP, POP, SMTP, IMAP, FTP. Các công cụ cấp cao này trọn vẹn ẩn đi những chi tiết cụ thể tương quan tới lập trình mạng cấp thấp với socket. Các bạn không cần phải biết tới những quy tắc thao tác với socket, mặc dầu socket là người chống sống lưng cho những công nghệ tiên tiến này .Trên. NET framework hiện có 1 số ít công nghệ tiên tiến tương hỗ tăng trưởng ứng dụng mạng : WCF ( Windows Communication Foundation ), ASP.NET Web API, ASP.NET MVC .Ví dụ, nếu cần tăng trưởng ứng dụng quản trị theo quy mô hướng dịch vụ ( SOA – service oriented application ) hoàn toàn có thể sử dụng công nghệ WCF hay ASP.NET Web API .Khi sử dụng những công cụ này, bạn được cung ứng sẵn những công cụ để thực thi việc truyền tài liệu giữa client và server qua giao thức HTTP. Bạn sẽ không cần chăm sóc đến phương pháp truyền dữ liệu ( cũng không cần chăm sóc đến HTTP ) nữa mà chỉ cần chăm sóc đến bản thân tài liệu đó thôi .Hầu hết những công nghệ tiên tiến / công cụ tương hỗ tăng trưởng ứng dụng cấp cao đều tương hỗ khá đầy đủ việc truyền tài liệu giữa client và server qua HTTP. Trên thực tiễn HTTP là một sự lựa chọn đặc biệt quan trọng thông dụng lúc bấy giờ để tăng trưởng những ứng dụng mạng, nhất là những ứng dụng quản trị, đồng thời nó cũng được những công nghệ tiên tiến tăng trưởng ứng dụng tương hỗ rất tốt .

HTTP không phải là giải pháp tốt cho nhiều loại ứng dụng. Ví dụ, game client và server không thể sử dụng HTTP để trao đổi dữ liệu, vì HTTP rất chậm và không duy trì trạng thái qua mỗi phiên truy vấn/phản hồi.

Theo dõi gói tin

Các ứng dụng mạng mặc dầu cho phép tất cả chúng ta nhìn thấy kết quả thực trên giao diện nhưng tất cả chúng ta không thực sự nhìn thấy những gì diễn ra trên mạng trong quy trình những ứng dụng trao đổi thông tin. Trong quy trình tăng trưởng ứng dụng, ngay cả khi đặt ghi lại dừng chương trình để xem stack, tất cả chúng ta cũng không hề nhìn thấy được tài liệu đã đóng gói và truyền đi trên mạng như thế nào .

Việc không nhìn thấy được dữ liệu “chạy” trên mạng gây ra rất nhiều khó khăn cho việc debug ứng dụng hoặc khi thiết kế giao thức truyền thông mới. Việc này cũng gây khó khăn cho việc hiểu được thực chất của quá trình truyền thông mạng.

Có 1 số ít công cụ giúp tất cả chúng ta bắt và nghiên cứu và phân tích những gói tin chạy trên mạng nhằm mục đích ship hàng cho quy trình tăng trưởng ứng dụng mạng .Nổi tiếng và được sử dụng thoáng đãng nhất là WireShark. Đây được nhìn nhận là công cụ can đảm và mạnh mẽ số 1 trong nghành này. Bạn hoàn toàn có thể tải về để thiết lập hoặc đọc thêm tài liệu về WireShark .

Một công cụ khác do Microsoft tăng trưởng có tên gọi Microsoft Message Analyzer ( MSA ) cũng có tính năng tương tự như WireShark. Ứng dụng này sinh ra để sửa chữa thay thế cho Microsoft Network Monitoring đã được sử dụng từ lâu bởi những quản trị viên Windows Server. MSA đặc biệt quan trọng tương thích với thiên nhiên và môi trường windows và sẽ được sử dụng hầu hết trong loạt bài này. Có thể tải MSA ở đây .