Download presentation
Presentation is loading. Please wait.
1
Socket Programming
2
Socket Programming Open Source Implementation: Linux Socket Filter
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 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個階層,分為網路存取層、 網際網路層、傳輸層和應用層 階層 說明 網路存取層
提供一個與實體網路之間的介面 網際網路層 提供與硬體無關的邏輯位置,並將封包(Packet)發送至網路上,並讓他們圖利的到達目的地。 傳輸層 為網際網路提共流程控制、錯誤檢查、回報服務,式與網路應用程式間的介面。 應用層 為網路除錯、檔案傳輸、遠端控制和網際網路活動提供應用程式。
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> int clode(int sockfd); 1.呼叫close() 若成功:傳回0 失敗:傳回-1
18
TCP Socket程式設計
19
UDP Socket程式設計
20
所有的網路應用程式皆可分為五個步驟: 開啟一個socket 為socket命名 與另一個socket結合 在sockets間收送資料 關閉socket
21
Socket Read/Write Inside out
User Space Server Client Server socket creation send data Client socket creation socket() bind() listen() write() accept() read() connect() sys_listen inet_listen sys_write do_sock_write sock_ sendmsg inet_ sendmsg tcp_ sendmsg tcp_ write_xmit sys_socket sock_create inet_create sys_bind inet_bind sys_accept inet_accept tcp_accept wait_for_ connection Kernel Space sys_read do_sock_read sock_ recvmsg sock_common_ recvmsg tcp_ recvmsg memcpy_ toiovec sys_connect inet_stream _connect tcp_v4_ getport tcp_v4_ connect inet_wait _connect sys_socketcall 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) network monitor rarpd filter buffer BPF protocol stack user kernel link-level driver network
Similar presentations