1 / 24

Socket Programming

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

veta
Download Presentation

Socket Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Socket Programming

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

  3. TCP/IP 簡介 • TCP/IP 的全稱是Transmission Control Protocol / Internet Protocol (TCP/IP) • 當初是用來配合ARPANET 來處理不同硬體之間的連接問題的。 • ARPANET除了研發出一套可靠的資料通訊技術外,還同時要兼顧跨平臺作業,從而奠定了今日的網際網路模式。

  4. TCP/IP模組架構 • 一個TCP/IP模組架構包含4個階層,分為網路存取層、網際網路層、傳輸層和應用層

  5. Socket 介紹 • socket 是一種可做雙向資料傳輸的通道,Linux程序可經由此裝置與本地端或是遠端的程序做溝通。

  6. Socket分類 • (1)Datagram sockets(connectionless) • 資料在datagram sockets間是利用UDP封包傳送,因此接收端socket可能會收到次序錯誤的資料,且其中部分資料亦可能會遺失。 • (2)Stream sockets(connection-oriented) • 資料在stream sockets間是利用TCP封包來傳送,因此接收端socket可以收到順序無誤、無重覆、正確的資料。此外TCP傳送時是採資料流的方式,因在傳送時會所有資料會視情況被分割在數個TCP封包中。

  7. Client/Server model • 每個網路應用程式都有一個通訊端點,一種端點是用戶端,另一種是伺服器。根據定義,用戶端會先送出第一個封包,由一個伺服器接收。在初步接觸後,用戶端和伺服器均能開始收送資料。 • 依據socket所提供的服務來將它分類,然而在用戶端和伺服器上的這兩個sockets必須是同一類才能互相通訊,也就是說,他們必須都是stream(TCP)或都是datagram(UDP)。

  8. 相關函式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)

  9. 相關函式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

  10. 相關函式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)

  11. 相關函式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

  12. 相關函式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。

  13. 相關函式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

  14. 相關函式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切了。

  15. 相關函式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

  16. 相關函式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

  17. 相關函式close() close() NAME read() - read from a file descriptor SYNOPSIS #include <unistd.h> intclode(intsockfd); • 1.呼叫close() • 若成功:傳回0 • 失敗:傳回-1

  18. TCP Socket程式設計

  19. UDPSocket程式設計

  20. 所有的網路應用程式皆可分為五個步驟: • 開啟一個socket • 為socket命名 • 與另一個socket結合 • 在sockets間收送資料 • 關閉socket

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

  22. Socket Read/Write Inside out

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

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

More Related