socket API的基本用法和TCP协议通讯流程

socket API

int socket(int domain,int type,int protocol);
       domain表示协议族:有AF_INET,AF_INET6,AF_LOCAL/AF_UNIX,AF_ROUTE
       type表示套接字类型:有SOCK_STREAM(提供有序,可靠,双向,基于连接的字节流),SOCK_DGRAM(支持无连接                                                      的,不可靠的和使用固定大小缓冲区的数据服务),SOCK_RAW
       protocol表示协议:有IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC,但是一般参数写0

int bind(int sockfd, const struct sockaddr *address,socklen_t address_len);
        第一个参数表示要绑定的socket,第二个参数表示要绑定给socket协议的地址,第三个参数就是地址的长度


int listen(int sockfd, int backlog);
        第一个参数表示要监听的socket   第二个参数表示相应socket可以排队的最大连接个数


int accept(int sockfd, struct sockaddr* address,socklen_t* address_len);
        第一个参数表示要接受的socket第二个参数表示要绑定给socket协议的地址,第三个参数就是地址的长度


int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)

        第一个参数表示要连接的socket第二个参数表示要绑定给socket协议的地址,第三个参数就是地址的长度


ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen); 

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

TCP协议通讯流程

三次握手:
    connect会发出SYN段并阻塞等待服务器应答; (第一次)
    服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建⽴连接"; (第二次)
    客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)

    *客户端-->服务器:SYN(请求建立连接)
    *服务器-->客户端:SYN+ACK(同意建立连接)
    *客户端-->服务器:ACK

四次挥手:
    如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次);
    此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次);
    read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端
        发送一个FIN; (第三次)
    客户端收到FIN, 再返回一个ACK给服务器; (第四次)
        
    *客户端-->服务器:FIN(请求关闭连接)
    *服务器-->客户端:ACK(同时read返回0,关闭)
    
    *服务器-->客户端:FIN(调用close)
    *客户端-->服务器:ACK

你可能感兴趣的:(socket API的基本用法和TCP协议通讯流程)