TCP协议简介
TCP:Transmission Control Protocol 传输控制协议
TCP的三个特性:面向连接、可靠传输、面向字节流
TCP建立通信流程
与DUP的通信流程不同,TCP与其特性对应,通信流程较为复杂,如下图所示
1.创建套接字:调用socket函数创建文件描述符;
接口:int socket( int domain, int type, int protocol );
domain:地址域类型
type:套接字类型
protocol:协议类型
2.绑定地址:调用bind函数将当前的文件描述符和ip/port绑定在一起。如果这个端口已经被其他进程占用了,就会绑定失败。
接口: int bind( int socket, const struct sockaddr *addr, socklen_t address_len );
socker:套接字描述符
addr:地址信息
address_len:地址信息长度
3.开始监听:调用listen函数,声明套接字处于监听状态,若有新连接到来,链接建立成功后,就会创建一个新的套接字来与这个客户端进行联系。
接口: int listen( int sockfd, int backlog);
sockfd:套接字描述符
backlog: 是未经过处理的连接请求队列可以容纳的最大数目(最大并发连接数)
监听状态下,内核为任何一个给定的监听套接口维护两个队列:
未完成连接队列(未完成三次握手队列):服务器正在等待完成相应的TCP三路握手过程,队列中套接口处于SYN_RCVD状态;
已完成连接队列(已经完成三次握手队列):已完成TCP三路握手过程的客户端对应其中一项,这些套接口都处于ESTABLISHED状态。
当队列中的连接数达到backlog个后,系统收到syn将不再回复syn+ack
4.新建连接:调用accept函数阻塞等待客户端连接到来。
接口:Int accept( int sockfd; struct sockaddr *addr, socklen_t *addrlen);
sockfd:套接字描述符,指获取哪个监听套接字新建的连接
addr:客户端的地址信息
addrlen:地址信息长度
5.发送连接请求:
接口:int connect (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
客户器端收到SYN+ACK后会从connect函数中返回,同时应答一个ACK段