1. Trang chủ
  2. » Công Nghệ Thông Tin

Bai 6 1 advanced UDP socket

28 274 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 28
Dung lượng 416 KB

Nội dung

UDP hay TCP ? Gửi tin broadcast hay multicast phải dùng UDP  Có thể dùng UDP với các ứng dụng với yêu cầu - trả lời đơn giản  Có thể dùng UDP vỚI các ứng dụng LAN  Băng thông lớn, ít

Trang 1

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

TS Nguyễn Hoài Sơn

Bộ môn mạng và Truyền thông máy tính, Đại học Công nghệ, Đại học QG Hà Nội

Trang 2

UDP hay TCP ?

 Gửi tin broadcast hay multicast phải dùng UDP

 Có thể dùng UDP với các ứng dụng với yêu cầu - trả lời đơn giản

 Có thể dùng UDP vỚI các ứng dụng LAN

 Băng thông lớn, ít lỗi

 Nên dùng UDP với truyền tin đa phương tiện

 Điều khiển luồng?

 Dùng TCP với việc truyền dữ liệu lớn

 TFTP (Trivial File Transfer Protocol) là một ngoại lệ

Trang 3

V n đ v i UDP ấ ề ớ

 Làm thế nào để lấy địa chỉ IP đích?

 Địa chỉ IP đích có thể là địa chỉ unicast hoặc địa chi multicast

 Làm thế nào biết và xử lý trong trường hợp gói tin UDP lớn hơn kích thước buffer?

 Làm thế nào để đảm bảo tính tin cậy khi

đường truyền có lỗi

 Acknowledgement, timeout, gửi lại

Trang 5

Remind: sendmsg and recvmsg

struct msghdr {

void *msg_name; /* protocol address */

socklen_t msg_namelen; /* size of protocol address */

struct iovec *msg_iov; /* scatter/gather array */

int msg_iovlen; /* # elements in msg_iov */

void *msg_control; /* ancillary data (cmsghdr struct) */

socklen_t msg_controllen; /* length of ancillary data */

int msg_flags; /* flags returned by recvmsg() */

};

#include <sys/socket.h>

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

Trang 6

Remind: sendmsg and recvmsg (2)

 thiết lập cờ chức năng cho việc xuất nhập dữ liệu

 MSG_DONTROUTE: bỏ qua truy vấn bảng định tuyến

 MSG_DONTWAIT: không chờ khi xuất nhập dữ liệu

 MSG_OOB: gửi và nhận dữ liệu ngoài luồng (out-of-band)

 MSG_PEEK: kiểm tra dữ liệu vào nhưng vẫn giữ nguyên

dữ liệu trong buffer

 MSG_WAITALL: đợi tất cả dữ liệu yêu cầu

 Cờ chức năng trả về bởi hàm recvmsg

 MSG_BCAST

 MSG_MCAST

 MSG_TRUNC

Trang 7

Remind: Sau khi hàm recvmsg tr k t ả ế

Trang 8

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ị của msg_flags được trả về bởi hàm recvmsg

 Địa chỉ đích của gói tin nhận được (sử dụng tùy biến socket

IP_RECVDSTADDR)

 Số hiệu của giao diện nhận gói tin (sử dụng tùy biến socket

IP_RECVIF)

Trang 9

D li u ph thu c ữ ệ ụ ộ

Gửi và nhận bằng thành phần msg_control và msg_controllen của cấu trúc msghdr với hàm sendmsg và recvmsg

 chứa một hoặc nhiều đối tượng dữ 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[] */

};

Trang 10

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

d li u ữ ệ

Trang 11

Returns: pointer to first cmsghdr structure or NULL if no ancillary data

struct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr) ;

Returns: pointer to next cmsghdr structure or NULL if no more ancillary data objects

unsigned char *CMSG_DATA(struct cmsghdr *cmsgptr) ;

Returns: pointer to first byte of data associated with cmsghdr structure

unsigned int CMSG_LEN(unsigned int length) ;

Returns: value to store in cmsg_len given the amount of data

unsigned int CMSG_SPACE(unsigned int length) ;

Returns: total size of an ancillary data object given the amount of data

Trang 12

recvfrom_flags function (2)

 advio/recvfromflags.c

Dữ liệu phụ thuộc kiểu IP_RECVIF

Trang 13

Hàm dg_echo v i ớ recvfrom_flags

 advio/dgechoaddr.c

Trang 14

Chia nh g ỏ ói 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

Trang 15

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 chủ gửi lại số thứ tự này trong thông báo trả lời

Timeout và gửi lại: khôi phục các gói tin bị mất mát

Gửi thông báo yêu cầu và đợi trong N giây

Nếu không có thông báo trả lời, gửi lại và đợi thêm N giây

 Lặp lại nhiều lần

Trang 16

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 1988]

g = 1/8, h = 1/4

Trang 17

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 RTO là quá nhỏ? RTT là bao nhiêu?

Trang 18

Gi i ph ả áp

 Thêm nhãn thời gian vào mỗi thông báo và máy chủ cũng phải gửi lại nhãn thời gian này

 Tính toán RTT bằng thời gian nhận gói tin trừ

đi nhãn thời gian ghi trong gói tin

=> Hàm dg_send_recv

Trang 19

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 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/1970 */ };

Trang 20

dg_send_recv function

 rtt/dg_send_recv.c

g = 1/8, h = 1/4

Trang 21

Các b ướ c th c hi n ự ệ

Khởi tạo đồng hồ đếm độ trễ

Khởi tạo dữ liệu gửi msgsend

• Tiêu đề chứa sequence number và nhãn thời gian

Đặt tín hiệu chuông

• Thời gian đổ chuông ban đầu

= độ trễ ước lượng

Chờ và nhận gói tin trả lời

Tính toán lại độ trễ ước lượng

alarm(rtt_star t(&rttinfo))

rtt_init(&rtti nfo)

rtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts)

timeout

Trang 23

Xu t nh p d li u I/O ấ ậ ữ ệ

Trang 24

copy complete

wait for data

copy data from kernel

to user process

deliver SIGIO system call

Trang 25

Các b ướ c th c hi n xu t nh p d li u ự ệ ấ ậ ữ ệ

 Thiết lập hàm xử lý tín hiệu SIGIO

 Thiết lập chủ sở hữu socket

Trang 26

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

Trang 27

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 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

Trang 28

Máy ch UDP Echo s d ng SIGIO ủ ử ụ

trong khi chương trình kiếm tra biến nqueue ?

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

TỪ KHÓA LIÊN QUAN

w