240 likes | 523 Views
Socket Programming. Socket Programming. TCP/IP 簡介 TCP/IP 模組架構 Socket 介紹 Socket 分類 Client/Server model ( 主從式架構模型 ) 相關函式 TCP Socket 程式 設計 UDP Socket 程式設計 Socket Read/Write Inside Out Performance Matters: Interrupt and Memory Copy at Socket
E N D
Socket Programming • TCP/IP 簡介 • TCP/IP模組架構 • Socket介紹 • Socket分類 • Client/Server model(主從式架構模型) • 相關函式 • TCP Socket程式設計 • UDPSocket程式設計 • Socket Read/Write Inside Out • Performance Matters: Interrupt and Memory Copy at Socket • Open Source Implementation: Linux Socket Filter
TCP/IP 簡介 • TCP/IP 的全稱是Transmission Control Protocol / Internet Protocol (TCP/IP) • 當初是用來配合ARPANET 來處理不同硬體之間的連接問題的。 • ARPANET除了研發出一套可靠的資料通訊技術外,還同時要兼顧跨平臺作業,從而奠定了今日的網際網路模式。
TCP/IP模組架構 • 一個TCP/IP模組架構包含4個階層,分為網路存取層、網際網路層、傳輸層和應用層
Socket 介紹 • socket 是一種可做雙向資料傳輸的通道,Linux程序可經由此裝置與本地端或是遠端的程序做溝通。
Socket分類 • (1)Datagram sockets(connectionless) • 資料在datagram sockets間是利用UDP封包傳送,因此接收端socket可能會收到次序錯誤的資料,且其中部分資料亦可能會遺失。 • (2)Stream sockets(connection-oriented) • 資料在stream sockets間是利用TCP封包來傳送,因此接收端socket可以收到順序無誤、無重覆、正確的資料。此外TCP傳送時是採資料流的方式,因在傳送時會所有資料會視情況被分割在數個TCP封包中。
Client/Server model • 每個網路應用程式都有一個通訊端點,一種端點是用戶端,另一種是伺服器。根據定義,用戶端會先送出第一個封包,由一個伺服器接收。在初步接觸後,用戶端和伺服器均能開始收送資料。 • 依據socket所提供的服務來將它分類,然而在用戶端和伺服器上的這兩個sockets必須是同一類才能互相通訊,也就是說,他們必須都是stream(TCP)或都是datagram(UDP)。
相關函式socket() NAME socket() - create an endpoint for communication SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 1. 由server和client使用 2. domain: 設AF_INET 3. type: SOCK_STREAM或SOCK_DGRAM 4. protocol: 0 (讓socket()根據type自動設定)。 5. 成功傳回socket descriptor,失敗傳回-1 (並使用errno的macro)
相關函式bind() NAME bind() - bind a name to a socket SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 1. 由server使用 2. sockfd為socket()的回傳值。 3. myaddr 須指定port和ip後傳入,注意是用struct sockaddr_in宣告 ,傳入時轉為struct sockaddr。 4. addrlen直接用sizeof(struct sockaddr) 5. bind就是將local的endpoint attach到一個socket
相關函式connect() NAME connect() - initiate a connection on a socket. SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 1. connect()由client呼叫 2. sockfd由socket()產生,serv_addr指定server的ip和port後傳入 3. addrlen直接用sizeof(struct sockaddr)
相關函式listen() NAME listen() - listen for connections on a socket SYNOPSIS #include <sys/socket.h> int listen(int sockfd, int backlog); 1. 由server使用 2. sockfd由socket()產生,backlog設定可queue住的connection數量 (等待accept())。 3. 失敗傳回-1
相關函式accept() NAME accept() - accept a connection on a socket SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, int *addrlen); 1. sockfd: listen()所使用的那個sockfd 2. addr 宣告完就拿來用,將存放client的資訊 3. addrlen直接用sizeof(struct sockaddr) 4.失敗傳回-1 5. server listen()完後開始等待accept()。 accept()傳回一個file descriptor以供此connection的I/O之用。 accpet完之後,server繼續使用listen()的fd等待下一個connection。
相關函式sendto() int sendto(int sockfd, const void *msg , int len, int flags); 1. sockfd可以是listen()的fd或是accpet的fd。 2. msg就是data,len就是data 的length (sizeof(msg)) ,flag就設0。 3. 回傳值為送出去的大小 4. 失敗傳回-1
相關函式recvfrom() • The recvfrom() call is similar in many respects: int recvfrom(int sockfd, void *buf , int len, unsigned int flags); 1. sockfd: 要從哪個fd接收。 2. 回傳值為收到的大小。若回傳0,表示對方把connection切了。
相關函式write() write() NAME write() - write to a file descriptor SYNOPSIS #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); 1. 可寫到file,device或socket
相關函式read() read() NAME read() - read from a file descriptor SYNOPSIS #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 1. 從file,device或socket讀取 2. 沒有data則read會block 3. count指定要讀的長度,如果沒有那麼多,則return,不會block
相關函式close() close() NAME read() - read from a file descriptor SYNOPSIS #include <unistd.h> intclode(intsockfd); • 1.呼叫close() • 若成功:傳回0 • 失敗:傳回-1
所有的網路應用程式皆可分為五個步驟: • 開啟一個socket • 為socket命名 • 與另一個socket結合 • 在sockets間收送資料 • 關閉socket
Socket Read/Write Inside out User Space Server Client Server socket creation send data Client socket creation send data socket() bind() listen() socket() read() accept() write() connect() sys_write do_sock_write sock_sendmsg inet_sendmsg tcp_sendmsg tcp_write_xmit sys_read do_sock_read sock_recvmsg sock_common_recvmsg tcp_recvmsg memcpy_toiovec sys_socketcall sys_socketcall sys_socket sock_create inet_create sys_accept inet_accept tcp_accept wait_for_connection sys_socket sock_create inet_create sys_connect inet_stream_connect tcp_v4_getport tcp_v4_connect inet_wait_connect sys_bind inet_bind sys_listen inet_listen Kernel Space Internet
Performance Matters: Interrupt and Memory Copy at Socket Latency in receiving TCP segments in the TCP layer Latency in transmitting TCP segments in the TCP layer
Open Source Implementation: Linux Socket Filter Linux Socket Filter (net/core/filter.c) Similar to BPF (Berkley Packet FIilter) rarpd network monitor network monitor user kernel protocolstack buffer buffer buffer filter filter filter BPF link-level driver link-level driver link-level driver kernel network