TCP通信流程及其接口

一、TCP通信流程

TCP通信流程和UDP通信流程大同小异,由于UDP是无连接的通信协议,而TCP是一种面向连接的通信协议,所以TCP通信流程比UDP多了一个双方发送和获取连接的步骤。

客户端
  1. 创建套接字。
  2. 绑定地址信息。(操作系统完成)
  3. 发起连接。
  4. 发送数据。
  5. 接收数据。
  6. 关闭套接字。
服务端
  1. 创建套接字。
  2. 绑定地址信息。
  3. 监听。告诉操作系统当前程序可以正常的接收连接了,是内核完成的。三次握手也是内核在监听的时候完成的。
  4. 获取连接。获取已经完成三次握手的连接。注意这一步会新创建出来一个socket(套接字描述符),通过新创建出来的socket和客户端进行数据收发。
  5. 接收数据。当tcp连接建立之后,不在乎客户端和服务端谁先给谁发送数据,两者都是可以直接发送数据的。
  6. 发送数据。
  7. 关闭套接字。

二、TCP编程套接字接口

  1. 创建套接字
    int socket(int domain, int type, int protocol);
  2. 绑定地址信息
    int bind(int sock_fd, const socket* addr, socklen_t addrlen);
  3. 监听
    int listen(int sock_fd, int backlog);
    • sock_fd:套接字描述符。
    • backlog:已完成连接队列的大小。
      已完成连接队列就是三次握手完成之后的连接都会被放在这个队列当中。 还处于三次握手当中的tcp连接就会放入未完成连接队列。backlog可以指定已完成连接的队列大小,如果当已完成连接队列已满,处理方式就是丢弃新来的连接;而需要使用新连接的时候,就从已完成连接队列当中获取创建完成的新连接。
  4. 发起连接(针对于客户端)
    int connect(int sock_fd, const struct sockaddr* addr, socklen_t addrlen);
    • sock_fd:套接字描述符。
    • addr:服务端地址信息,需要自己手动在代码当中填充,传递给connect。
    • addrlen:地址信息长度。
  5. 获取连接(针对于服务端)
    int accept(int sock_fd, struct sockaddr* addr, socklen_t* addrlen);
    • sock_fd:侦听套接字描述符。
    • addr:客户端地址信息。
    • addrlen:客户端地址信息长度。
    • 返回值:返回新创建出来的socket(套接字描述符),后面的数据收发过程都是需要这个新创建出来的socket和客户端进行数据收发。
      注意:因为该接口是从已完成连接队列当中获取新连接,所以当已完成连接队列当中没有已经完成的连接时,再次调用accept就会阻塞;直到获取到新的已完成的连接。
      在这里插入图片描述
      为什么内核需要新创建一个socket和客户端进行通信?
      1. 如果只有一个socket,则无法区分是哪个客户端发送来的数据。
      2. 如果只有一个socket,则在接收一个TCP连接之后和通信起来之后,再接收新的连接。第一个socket就像酒店的接待员,而新创建的socket才是真正为客户进行服务的。如果只有一个socket,那就不能为下一个新来的客户进行服务了。
  6. 发送数据
    ssize_t send(sock_fd, const void* buf, size_t len, int flags);
    • sock_fd:套接字描述符。注意这个sock_fd是accept函数的返回值,即新建出来的server_fd。
    • buf:要发送的数据。
    • len:发送数据的长度。
    • flags:0:阻塞发送
  7. 接收数据
    ssize_t recv(int sock_fd, void* buf, int flags);
    • sock_fd:套接字描述符。注意这个sock_fd是accept函数的返回值,即新建出来的server_fd。
    • buf:接收到的数据放到哪里去。
    • len:最大接收长度。
    • flags:
      a. 0:阻塞接收。
      b. MSG_PEEK:探测接收。从接收缓冲区当中复制数据到应用层,但并不删除接收缓冲区中的数据。相比较阻塞接收而言,阻塞接收也会从接收缓冲区复制数据到应用层,但是会删除接收缓冲区中的数据。
  8. 关闭套接字
    close(int sock_fd);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值