TCP: 传输控制协议(Transmission Control Protocol),传输层协议之一(TCP,UDP)
UDP(用户数据报协议)
TCP(传输控制协议)
指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接
断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开
TCP编程:基于C/S模型的socket文件进行通信
socket(AF_INET, SOCK_STREAM, 0);
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:
发送三次握手链接请求
参数:
sockfd:套接字文件描述符
addr:存放目的地址空间首地址
addrlen:目的地址长度
返回值:
成功返回0
失败返回-1
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
发送数据
参数:
sockfd:套接字文件描述符
buf:存放数据空间首地址
len:数据长度
flag:属性默认为0
返回值:
成功返回发送字节数
失败返回-1
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收数据
参数:
sockfd:套接字文件描述符
buf:存放数据空间首地址
len:最多接收数据长度
flags:接收属性默认为0
返回值:
成功返回实际接收字节数
失败返回-1
连接断开返回0
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
int listen(int sockfd, int backlog);
功能:
监听三次握手链接请求
参数:
sockfd:套接字文件描述符
backlog:最多允许等待尚未处理的三次握手链接个数
返回值:
成功返回0
失败返回-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
参数:
sockfd:套接字文件描述符
addr:存放发送端IP地址空间首地址
addrlen:想要接收的IP地址的长度
返回值:
成功返回新文件描述符
失败返回-1
TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题
产生原因
解决方案
标志位:
滑动窗口大小:是TCP流量控制得一个手段。目的是告诉对方,本端的TCP接受缓冲区还能容纳多少字节得数据,这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535
保证可靠性的同时又要尽可能的提高性能
可靠性:
提高性能: