Bai 6 1 advanced UDP socket

28 274 0
Bai 6 1 advanced UDP socket

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Lập trình UDP socket nâng cao TS Nguyễn Hoài Sơn Bộ môn mạng Truyền thông máy tính, Đại học Công nghệ, Đại học QG Hà Nội UDP hay TCP ?    Gửi tin broadcast hay multicast phải dùng UDP Có thể dùng UDP với ứng dụng với yêu cầu trả lời đơn giản Có thể dùng UDP vỚI ứng dụng LAN   Nên dùng UDP với truyền tin đa phương tiện   Băng thông lớn, lỗi Điều khiển luồng? Dùng TCP với việc truyền liệu lớn  TFTP (Trivial File Transfer Protocol) ngoại lệ Vấn đề với UDP  Làm để lấy địa IP đích?    Địa IP đích địa unicast địa chi multicast Làm biết xử lý trường hợp gói tin UDP lớn kích thước buffer? Làm để đảm bảo tính tin cậy đường truyền có lỗi  Acknowledgement, timeout, gửi lại Lấy cờ hiệu, địa IP đích số hiệu giao diện mạng  Dùng sendmsg recvmsg để lấy   cờ hiệu từ socket liệu phụ thuộc địa IP số hiệu giao diện đích trường hợp có nhiều giao diện mạng Remind: sendmsg and recvmsg #include ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags); Both return: number of bytes read or written if OK, –1 on error struct msghdr { void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; int msg_iovlen; void *msg_control; socklen_t msg_controllen; int msg_flags; }; /* protocol address */ /* size of protocol address */ /* scatter/gather array */ /* # elements in msg_iov */ /* ancillary data (cmsghdr struct) */ /* length of ancillary data */ /* flags returned by recvmsg() */ Remind: sendmsg and recvmsg (2)  thiết lập cờ chức cho việc xuất nhập liệu       MSG_DONTROUTE: bỏ qua truy vấn bảng định tuyến MSG_DONTWAIT: không chờ xuất nhập liệu MSG_OOB: gửi nhận liệu luồng (out-of-band) MSG_PEEK: kiểm tra liệu vào giữ nguyên liệu buffer MSG_WAITALL: đợi tất liệu yêu cầu Cờ chức trả hàm recvmsg    MSG_BCAST MSG_MCAST MSG_TRUNC Remind: Sau hàm recvmsg trả kết Ví dụ: hàm recvfrom_flags  ssize_t recvfromflags(int fd, void *ptr, size_t nbytes, int *flagsp, SA *sa, socklen_t *salenptr, struct unp_in_pktinfo *pktp)  struct unp_in_pktinfo { struct in_addr ipi_addr; /* destination IPv4 address */ int ipi_ifindex; /* received interface index */ };  Trả về:    Giá trị msg_flags trả hàm recvmsg Địa đích gói tin nhận (sử dụng tùy biến socket IP_RECVDSTADDR) Số hiệu giao diện nhận gói tin (sử dụng tùy biến socket IP_RECVIF) Dữ liệu phụ thuộc   Gửi nhận thành phần msg_control msg_controllen cấu trúc msghdr với hàm sendmsg recvmsg chứa nhiều đối tượng liệu phụ thuộc   each one begins with a cmsghdr structure struct cmsghdr { socklen_t cmsg_len; /* length in bytes, including this structure */ int cmsg_level; /* protocol family */ int cmsg_type; /* protocol-specific type */ /* followed by unsigned char cmsg_data[] */ }; Dữ liệu phụ thuộc chứa hai đối tượng liệu Chia nhỏ gói tin UDP Khi nhận gói tin UDP lớn kích thước buffer, hệ thống xử lý theo cách sau tùy thuộc vào OS  Bỏ phần liệu vượt kích thước buffer, trả cờ MSG_TRUNC cho tiến trình xử lý  recvmsg thiết lập cờ MSG_TRUNC msg_flags cấu trúc msghdr  Bỏ phần liệu thừa không thông báo cho tiến trình xử lý  Giữ phần liệu thừa trả lần đọc liệu socket sau => cần thiết lập kích thước buffer lớn kích thước lớn gói tin UDP nhận byte  Tạo tính tin cậy cho ứng dụng UDPs  Thực yêu cầu  Số thứ tự (Sequence numbers): Bên nhận xác nhận số thứ tự thông báo nhận   Client thêm số thứ tự vào thông báo yêu cầu máy chủ gửi lại số thứ tự thông báo trả lời Timeout gửi lại: khôi phục gói tin bị mát   Gửi thông báo yêu cầu đợi N giây Nếu thông báo trả lời, gửi lại đợi thêm N giây  Lặp lại nhiều lần Tạo tính tin cậy cho ứng dụng UDPs (2)  Làm để xác định N thích hợp? RTT mạng LAN WAN khác  RTT máy khách máy chủ thay đổi nhanh chóng  Cần tính toán RTT thực => Giải pháp từ [Jacobson 1988]  g = 1/8, h = 1/4 Vấn đề không rõ ràng gửi lại Thông báo yêu cầu bị mất? Thông báo trả lời bị mất? Khoảng RTO nhỏ? RTT bao nhiêu? Giải pháp   Thêm nhãn thời gian vào thông báo máy chủ phải gửi lại nhãn thời gian Tính toán RTT thời gian nhận gói tin trừ nhãn thời gian ghi gói tin => Hàm dg_send_recv struct rtt_info  struct rtt_info { float rtt_rtt; /* RTT gần nhất, đơn vị giây */ float rtt_srtt; /* Ước lượng RTT, đơn vị giây */ float rtt_rttvar; /* Ước lượng độ lệch trung bình, đơn vị giây */ float rtt_rto; /* RTT tại, đơn vị giây */ int rtt_nrexmt; /* số lần gửi lại: 0, 1, 2, */ uint32_t rtt_base; /* thời gian (giây) tính từ 1/1/1970 */ }; dg_send_recv function  rtt/dg_send_recv.c g = 1/8, h = 1/4 Các bước thực Khởi tạo đồng hồ đếm độ trễ rtt_init(&rtti nfo) Khởi tạo liệu gửi msgsend • Tiêu đề chứa sequence number nhãn thời gian Đặt tín hiệu chuông • Thời gian đổ chuông ban đầu = độ trễ ước lượng alarm(rtt_star t(&rttinfo)) timeout Chờ nhận gói tin trả lời Tính toán lại độ trễ ước lượng rtt_stop(&rttinfo, rtt_ts(&rttinfo) recvhdr.ts) Các hàm tính toán độ trễ lib/rtt.c  rtt_init  rtt_ts, rtt_newpack, rtt_start, rtt_stop Xuất nhập liệu I/O điều khiển tín hiệu Mô hình xuất nhập liệu điều khiển tín hiệu kernel application process continues executing establish SIGIO signal handler signal handler recvfrom process blocks while data is copied into application buffer sigaction system call return deliver SIGIO system call return OK process datagram wait for data datagram ready copy datagram copy complete copy data from kernel to user Các bước thực xuất nhập liệu điều khiển tín hiệu   Thiết lập hàm xử lý tín hiệu SIGIO Thiết lập chủ sở hữu socket   sử dụng lệnh F_SETOWN hàm fcntl Cho phép xuất nhập liệu điều khiển tín hiệu  sử dụng lệnh F_SETFL hàm fcntl để thiết lập cờ O_ASYNC SIGIO với UDP Sockets  Tín hiệu SIGIO sinh   Socket nhận gói tin Lỗi không đồng xuất socket SIGIO với TCP Sockets  Nhiều điều kiện để tạo tín hiệu SIGIO        Một yêu cầu kết nối kết thúc socket lắng nghe Một yêu cầu kết nối khởi tạo Một yêu cầu ngắt kết nối hoàn thành Một nửa kết nối bị đóng Dữ liệu đến socket Dữ liệu gửi từ socket Lỗi không đồng xuất => Ít sử dụng SIGIO với TCP socket Máy chủ UDP Echo sử dụng SIGIO  sigio/dgecho01.c     Đặt liệu nhận hàng đợi liệu chờ xử lý Sau xử lý tín hiệu SIGIO, tăng biến đếm hàng đợi nqueue Gửi lại liệu nhận biến đếm hàng đợi khác Điều xảy tín hiệu SIGIO không bị chặn chương trình kiếm tra biến nqueue ? [...]... socket   sử dụng lệnh F_SETOWN của hàm fcntl Cho phép xuất nhập dữ liệu bằng điều khiển tín hiệu  sử dụng lệnh F_SETFL của hàm fcntl để thiết lập cờ O_ASYNC SIGIO với UDP Sockets  Tín hiệu SIGIO được sinh ra khi   Socket nhận được một gói tin Lỗi không đồng bộ xuất hiện tại socket SIGIO với TCP Sockets  Nhiều điều kiện để tạo ra tín hiệu SIGIO        Một yêu cầu kết nối kết thúc tại socket. .. rtt_rttvar; /* Ước lượng độ lệch trung bình, đơn vị giây */ float rtt_rto; /* RTT hiện tại, đơn vị giây */ int rtt_nrexmt; /* số lần gửi lại: 0, 1, 2, */ uint32_t rtt_base; /* thời gian (giây) tính từ 1/ 1 /19 70 */ }; dg_send_recv function  rtt/dg_send_recv.c g = 1/ 8, h = 1/ 4 Các bước thực hiện Khởi tạo đồng hồ đếm độ trễ rtt_init(&rtti nfo) Khởi tạo dữ liệu gửi msgsend • Tiêu đề chứa sequence number và nhãn... tại socket lắng nghe Một yêu cầu kết nối được khởi tạo Một yêu cầu ngắt kết nối được hoàn thành Một nửa kết nối bị đóng Dữ liệu đến socket Dữ liệu được gửi từ socket Lỗi không đồng bộ xuất hiện => Ít sử dụng SIGIO với TCP socket Máy chủ UDP Echo sử dụng SIGIO  sigio/dgecho 01. c     Đặt dữ liệu nhận được trong hàng đợi dữ liệu chờ xử lý Sau khi xử lý tín hiệu SIGIO, tăng biến đếm của hàng đợi nqueue... báo trả lời, gửi lại và đợi thêm N giây  Lặp lại nhiều lần Tạo tính tin cậy cho ứng dụng UDPs (2)  Làm thế nào để xác định N thích hợp? RTT trong mạng LAN và WAN là khác nhau  RTT giữa máy khách và máy chủ có thể thay đổi nhanh chóng  Cần tính toán RTT thực sự => Giải pháp từ [Jacobson 19 88]  g = 1/ 8, h = 1/ 4 Vấn đề không rõ ràng khi gửi lại Thông báo yêu cầu bị mất? Thông báo trả lời bị mất? Khoảng... tin UDP Khi nhận một gói tin UDP lớn hơn kích thước buffer, hệ thống có thể xử lý theo các cách sau tùy thuộc vào từng OS  Bỏ phần dữ liệu vượt quá kích thước buffer, và trả về cờ MSG_TRUNC cho tiến trình xử lý  recvmsg thiết lập cờ MSG_TRUNC trong msg_flags của cấu trúc msghdr  Bỏ phần dữ liệu thừa và không thông báo cho tiến trình xử lý  Giữ phần dữ liệu thừa và trả về ở lần đọc dữ liệu socket. .. thông báo cho tiến trình xử lý  Giữ phần dữ liệu thừa và trả về ở lần đọc dữ liệu socket sau đó => cần thiết lập kích thước buffer lớn hơn kích thước lớn nhất của gói tin UDP có thể nhận được một byte  Tạo tính tin cậy cho ứng dụng UDPs  Thực hiện 2 yêu cầu  Số thứ tự (Sequence numbers): Bên nhận xác nhận số thứ tự của thông báo nhận được   Client thêm số thứ tự vào mỗi thông báo yêu cầu và máy...Các hàm macros để đơn giản hóa xử lý dữ liệu phụ thuộc #include #include /* for ALIGN macro on many implementations */ struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mhdrptr) ; Returns: pointer to first cmsghdr structure or NULL if no ancillary .. .UDP hay TCP ?    Gửi tin broadcast hay multicast phải dùng UDP Có thể dùng UDP với ứng dụng với yêu cầu trả lời đơn giản Có thể dùng UDP vỚI ứng dụng LAN   Nên dùng UDP với truyền... hiệu SIGIO sinh   Socket nhận gói tin Lỗi không đồng xuất socket SIGIO với TCP Sockets  Nhiều điều kiện để tạo tín hiệu SIGIO        Một yêu cầu kết nối kết thúc socket lắng nghe Một... nối hoàn thành Một nửa kết nối bị đóng Dữ liệu đến socket Dữ liệu gửi từ socket Lỗi không đồng xuất => Ít sử dụng SIGIO với TCP socket Máy chủ UDP Echo sử dụng SIGIO  sigio/dgecho01.c    

Ngày đăng: 22/12/2016, 13:11

Từ khóa liên quan

Mục lục

  • Lập trình UDP socket nâng cao

  • UDP hay TCP ?

  • Vấn đề với UDP

  • Lấy cờ hiệu, địa chỉ IP đích và số hiệu giao diện mạng

  • Remind: sendmsg and recvmsg

  • Remind: sendmsg and recvmsg (2)

  • Remind: Sau khi hàm recvmsg trả kết quả về

  • Ví dụ: hàm recvfrom_flags

  • Dữ liệu phụ thuộc

  • Dữ liệu phụ thuộc chứa hai đối tượng dữ liệu

  • Các hàm macros để đơn giản hóa xử lý dữ liệu phụ thuộc

  • recvfrom_flags function (2)

  • Hàm dg_echo với recvfrom_flags

  • Chia nhỏ gói tin UDP

  • Tạo tính tin cậy cho ứng dụng UDPs

  • Tạo tính tin cậy cho ứng dụng UDPs (2)

  • Vấn đề không rõ ràng khi gửi lại

  • Giải pháp

  • struct rtt_info

  • dg_send_recv function

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan