TCP通信流程
TCP和UDP的简单回顾;
TCP和UDP 是传输层协议。
UDP 是用户数据报协议的简写,面向无连接,可以单播,多播,广播,不仅支持一对一,还支持一对多,多对一,多对多的连接方式。udp是面向数据报的,不可靠的协议。效率高。不可靠。
TCP传输控制协议,面向连接的,可靠的。基于字节流的传输协议。仅支持单播传输。仅支持点对点的传输。
TCP 和 UDP 的对比
TCP 通信的流程
服务器端
服务器端是一个被动接受连接的角色
- 创建一个用于监听的套接字
- 监听:监听有客户端的链接
- 套接字:本质是一个文件描述符,
- 将监听的文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)
- 客户端连接服务器的时候使用的就是这个ip和端口;
- 设置监听,监听的fd开始工作。
- 阻塞等待,当有客户端发起连接,接触阻塞,接受客户端的连接,会得到一个和客户端通信的套接字。会产生一个新的文件描述符。第一个文件描述符只负责监听,第二个文件描述符用来通信。而不是用监听的文件描述符来进行通信。
- 通信
- 接受数据
- 发送数据
- 通信结束,断开连接
客户端
- 创建一个用于通信的套接字(fd)
- 连接服务器,需要指定连接的服务器的ip和端口。
- 连接成功,客户端可以直接和服务器通信
- 接收数据
- 发送数据
- 通信结束,断开连接。
socket函数
创建套接字
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
int bind(int sockfd,const struct sockaddr*my_addr,socklen_t addrlen);
功能 绑定,将fd和本地ip+端口进行绑定
sockfd:通过socket函数得到的文件描述符
addr: 需要绑定的socket地址,这个地址封装了ip和端口信息
addrlen:第二个参数结构体占用的内存大小
监听socket
#include<sys/socket.h>
int listen(int sockfd,int backlog);
sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度。监听队列的长度如果超过backlog,服务器将不受理新的客户连接,客户端也将收到ECONNREFUSED错误信息
有两个队列,一个未连接队列,一个已连接队列,backlog是两个值的和 。backlog参数的典型值是5。
listen成功时返回0,失败则返回-1并设置errno。
接受连接
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);
功能:接受客户端连接,默认是一个阻塞的函数,阻塞等待客户端的连接
addr参数用来获取被接受连接的远端socket地址 传出参数,记录了连接成功后的客户端信息(ip,port)。
addrlen: 指定第二个参数对应的内存大小。
成功:用于通信的文件描述符
-1:失败
发起连接
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,const struct sockaddr*serv_addr,socklen_t
addrlen);
功能:客户端连接服务器
参数 :
sockfd, 用于通信的文件描述符
serv_addr,客户端要连接的服务器的地址信息
addrlen:第二个参数的内存大小
返回值:
成功 0;
失败-1;
数据读写
Tcp数据读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd,void*buf,size_t len,int flags);
ssize_t send(int sockfd,const void*buf,size_t len,int flags);