24.9.21学习目录
- 一.TCP
- 1.TCP流程
- 2.TCP相关函数
- 3.三次握手
一.TCP
1.TCP流程
服务器流程:
- 创建套接字socket()
- 将套接字与服务器网络信息结构体绑定bind()
- 将套接字设置为监听状态listen()
- 阻塞等待客户端的连接请求accept()
- 进行通信接收或发送(recv()或send())
- 关闭套接字close()
客户端流程:
- 创建套接字socket()
- 发送客户端连接请求connect()
- 进行通信接收或发送(recv()或send())
- 关闭套接字close()
//TCP套接字的设置,AF_INET为IPv4,SOCK_STREAM设置为TCP方法
socket(AF_INET,SOCK_STREAM,0);
2.TCP相关函数
(1)connect
主动跟服务器建立连接
#include <sys/socket.h>int connect(int sockfd,const struct sockaddr *addr,socklen_t len);
len:为addr的长度
注意:
connect建立连接后不会产生新的套接字;
连接成功后才可以开始传输TCP数据;
(2)send
ssize_t send(int sockfd,const void* buf,size_t nbytes,int flags);
buf:发送数据的地址
nbytes:发送缓存数据的大小
flags:套接字标志(常为0为阻塞,也可以为MSG_SONTWAIT为非阻塞)
注意:
TCP不能发送0长度的数据包
(3)recv
接收数据
ssize_t recv(int sockfd,void *buf,size_t nbytes,int flags);
buf:接收数据的缓冲区地址
(4)listen
将套接字修改为被动,让操作系统给该套接字设置一个连接队伍,用来记录所有连接到该套接字的连接
int listen(int sockfd,int backlog);
backlog:连接队列的长度,即设置服务器最大的连接客服的数量
(4)accept
从连接队列中取出一个已经建立的连接,如果没有任何连接可用,则进入睡眠等待
int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
cliaddr:用于存放客户端套接字地址结构
addrlen:接字地址结构长度的地址
注意:
其返回的是一个已连接的套接字,这个套接字代表当前这个连接
3.三次握手
(1)close关闭套接字
其是关闭一个代表已经连接套接字,则会出现向另外一端接收到一个长度为0的数据包;
关闭使用socket函数创建的套接字,会导致服务器无法接收新的连接,但不会影响已经连接的;
关闭accept返回的套接字,则会导致其连接关闭,但不会影响服务器的;
过程:
- 客户端向服务器发SYN,序号为J
- 服务器接收到数据后,向服务器发送SYN和ACK,序号分别为K和J+1
- 当客户端接收到数据后,确认ACK的序号为其发送的序号加一
- 客户端向服务器发送ACK,序号为K+1