网络编程之TCP协议
传输层协议:UDP和TCP的区别
UDP:用户数据报协议
1.面向数据报
2.无连接
3.不安全,不可靠(尽最大努力交付)
TCP:传输控制协议
1.面向数据流(流式套接字)
2.建立连接
3.安全可靠的传输协议
TCP的传输过程
三次握手:TCP建立连接时,需要进行三次握手,确保收发数据前,都已准备就绪
假设客户端和服务端通信:
1.第一次握手:客户端給服务端一个SYN
2.第二次握手:服务端给客户端一个ACK+SYN
3.第三次握手:客户端给服务端一个ACK
四次挥手:TCP断开连接时,需要进行四次挥手,从而确保通信双方都已收发数据结束。
TCP编程
C/S模型:
客户端的函数接口:
socket():创建套接字
.socket
套接字:通信对象的抽象, 网络通信的端口,一个通信链的句柄。
int socket(int domain, int type, int protocol);
功能:
创建一个用来通信的接口(文件描述符)
参数:
domain:通信的协议族(AF_INET:IPv4协议族)
type:
SOCK_DGRAM:数据报套接字 (UDP使用此类型)
SOCK_STEAM:流式套接字 (TCP使用此类型)
SOCK_RAW:原始套接字
protocol:
默认传0 按照协议的默认属性创建
返回值:
成功返回用来进行通信的文件描述符
失败返回-1
connect()
connect
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:
发送三次握手链接请求
参数:
sockfd:套接字文件描述符
addr:存放目的地址空间首地址
addrlen:目的地址长度
返回值:
成功返回0
失败返回-1
send()
send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
发送数据
参数:
sockfd:套接字文件描述符
buf:存放数据空间首地址
len:数据长度
flag:属性默认为0
返回值:
成功返回发送字节数
失败返回-1
recv()
recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收数据
参数:
sockfd:套接字文件描述符
buf:存放数据空间首地址
len:最多接收数据长度
flags:接收属性默认为0
返回值:
成功返回实际接收字节数
失败返回-1
连接断开返回0
服务端所要的函数接口
bind() :绑定IP地址和端口号
5.bind
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
参数:
sockfd:套接字文件描述符
addr:IP地址和端口号结构体首地址
addrlen:长度
返回值:
成功返回0
失败返回-1
listen()
listen
int listen(int sockfd, int backlog);
功能:
监听三次握手链接请求
参数:
sockfd:套接字文件描述符
backlog:最多允许等待尚未处理的三次握手链接个数
返回值:
成功返回0
失败返回-1
accept()
.accept
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
参数:
sockfd:套接字文件描述符
addr:存放发送端IP地址空间首地址
addrlen:想要接收的IP地址的长度
返回值:
成功返回新文件描述符(通信套接字)
失败返回-1