socket programming

24
Socket Programming

Upload: oral

Post on 22-Feb-2016

84 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Socket Programming

Socket ProgrammingSocket ProgrammingTCP/IP TCP/IPSocketSocketClient/Server model()TCP SocketUDP SocketSocket Read/Write Inside OutPerformance Matters: Interrupt and Memory Copy at SocketOpen Source Implementation: Linux Socket Filter

TCP/IP TCP/IP Transmission Control Protocol / Internet Protocol (TCP/IP)ARPANET ARPANET

TCP/IP TCP/IP4

(Packet)Socket socket Linux

Socket

1Datagram sockets(connectionless) datagram socketsUDPsocket2Stream sockets(connection-oriented) stream socketsTCPsocketTCPTCP

Client/Server model socketsocketsstream(TCP)datagram(UDP)socket()NAME socket() - create an endpoint for communicationSYNOPSIS #include #include int socket(int domain, int type, int protocol);1. serverclient2. domain: AF_INET3. type: SOCK_STREAMSOCK_DGRAM4. protocol: 0 (socket()type)5. socket descriptor-1 (errnomacro)bind()NAME bind() - bind a name to a socketSYNOPSIS #include #include int bind(int sockfd, struct sockaddr *my_addr, int addrlen);1. server2. sockfdsocket()3. myaddr portipstruct sockaddr_instruct sockaddr4. addrlensizeof(struct sockaddr)5. bindlocalendpoint attachsocketconnect()NAME connect() - initiate a connection on a socket.SYNOPSIS#include #include int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);1. connect()client2. sockfdsocket()serv_addrserveripport3. addrlensizeof(struct sockaddr)listen()NAME listen() - listen for connections on a socketSYNOPSIS #include int listen(int sockfd, int backlog);1. server2. sockfdsocket()backlogqueueconnection (accept())3. -1accept()NAME accept() - accept a connection on a socketSYNOPSIS #include #include int accept(int sockfd, struct sockaddr *addr, int *addrlen);1. sockfd: listen()sockfd2. addr client3. addrlensizeof(struct sockaddr)4.-15. server listen()accept()accept()file descriptorconnectionI/Oaccpetserverlisten()fdconnectionsendto()int sendto(int sockfd, const void *msg, int len, int flags);1. sockfdlisten()fdaccpetfd2. msgdatalendata length (sizeof(msg))flag03. 4. -1recvfrom()The recvfrom() call is similar in many respects:int recvfrom(int sockfd, void *buf, int len, unsigned int flags);1. sockfd: fd2. 0connectionwrite()write()NAME write() - write to a file descriptorSYNOPSIS #include ssize_t write(int fd, const void *buf, size_t count);1. filedevicesocketread()read()NAME read() - read from a file descriptorSYNOPSIS #include ssize_t read(int fd, void *buf, size_t count);1. filedevicesocket2. datareadblock3. countreturnblockclose()close()NAME read() - read from a file descriptorSYNOPSIS #include int clode(int sockfd);1.close()0-1

TCP Socket

UDP Socket

socketsocketsocketsocketssocket

Socket Read/Write Inside outUser SpaceServerClientServer socket creationsend dataClient socket creationsend datasocket()bind()listen()write()accept()socket()read()connect()sys_listen

inet_listensys_write

do_sock_write

sock_sendmsg

inet_sendmsg

tcp_sendmsg

tcp_write_xmit

sys_socket

sock_create

inet_createsys_bind

inet_bind

sys_accept

inet_accept

tcp_accept

wait_for_connectionKernel Spacesys_socket

sock_create

inet_createsys_read

do_sock_read

sock_recvmsg

sock_common_recvmsg

tcp_recvmsg

memcpy_toiovecsys_connect

inet_stream_connect

tcp_v4_getport

tcp_v4_connect

inet_wait_connectsys_socketcallInternetsys_socketcallSocket Read/Write Inside out

Performance Matters: Interrupt and Memory Copy at Socket

Latency in transmitting TCP segments in the TCP layerLatency in receiving TCP segments in the TCP layerOpen Source Implementation: Linux Socket FilterLinux Socket Filter (net/core/filter.c)Similar to BPF (Berkley Packet FIilter)network monitornetwork monitorrarpdfilterfilterfilterbufferbufferbufferBPFprotocolstackuserkernellink-leveldriverlink-leveldriverlink-leveldrivernetworkkernelsocket()connect()write()read()close()socket()bind()listen()accept()read()write()read()close()connection establishment(TCP Three-way handshake)data (request)data (reply)end-of-life notificationprocess requestblocks until connection from client1. switch to passive socket2. create connection queueTCP ServerTCP Clientobtain a descriptorassign IP & port to the socketenter ESTABLISHED stateinitiate 3-way handshakeobtain a descriptorsocket()recvfrom()sendto()recvfrom()close()socket()bind()sendto()data (request)data (reply)process requestblocks until connection from clientobtain a descriptorUDP ServerUDP Clientobtain a descriptorassign IP & port to the socketsocket()recvfrom()sendto()recvfrom()close()socket()bind()sendto()data (request)data (reply)process requestblocks until connection from clientobtain a descriptorUDP ServerUDP Clientobtain a descriptorassign IP & port to the socketsocket()recvfrom()sendto()recvfrom()close()socket()bind()sendto()data (request)data (reply)process requestblocks until connection from clientobtain a descriptorUDP ServerUDP Clientobtain a descriptorassign IP & port to the socketcountfile_lockmax_fdsnext_fdmax_fdsetfd[0]fd[1]fd[255]KKlinux/sched.hstruct files_structKKf_dentryf_listmax_fdsf_opf_vfsmntf_countf_flagsf_modef_posd_flagsKKd_countd_inodeKKd_parentKKskKKKKlinux/fs.hstruct filelinux/dentry.hstruct dentrylinux/fs.hstruct inodeinodefileKKstruct socket

s_addrd_addrdportnet/sock.hstruct sockbound_dev_ifsportKKreceive_queuewrite_queueprotoKKKKstruct tcp_opt

union tp_pinfo

KKsnd_cwndKKKKsk_filterKKsocketKKconnectclosedisconnectioctlacceptinitdestoryshutdownsetsockoptgetsockoptnet/sock.hstruct protosendmsgrecvmsgKKtcp_v4_connecttcp_closetcp_disconnecttcp_ioctltcp_accepttcp_v4_init_socktcp_v4_destory_socktcp_shutdowntcp_setsockopttcp_getsockopttcp_sendmsgtcp_recvmsgKKipv4/tcp_ipv4.cstruct tcp_funcunion u

opened Linux socket