写在前面:
主要概论和一些具体疑问以及更多的提问式思考。
UNP和TCP/IP详解
一.TCP三路握手,连接终止:
1.tcp可靠性实现之一。三个分组()确保服务器和客户端的确认信息都会有回应。
2.每次回应序号加一防止被延时的分组又被重传的情况下,导致错误。
3.连接终止,服务端半关闭,服务端close套接字,也会发送一个FIN,为四个分组。
4.建立连接的超时机制。connect后发送FIN无响应,6s->24s->75s无响应返回出错。
5.listen()把未连接套接字编程被动套接字(提示内核接受指向该套接字的请求)。 成功返回listening socket
6.accept()从已完成连接队列头(三路握手完成)返回下一个已完成连接。 成功返回connected socket
一个服务器仅仅创建一个 监听套接字 listening socket 生命周期内存在。
服务器进程接受的客户 已连接套接字 connected socket 完成服务被关闭。
二.TCP和UDP区别:
TCP 传输控制协议 (Transmission Control Protocol) 面向连接协议; 全双工字节流->stream socket; 关注确认,超时,重传细节。
UDP 用户数据报协议 (User Datagram Protocol) 无连接协议; 数据包套接字->datagram socket; 无法保证能否到达目的地。
大多数tcp服务器并发,udp服务器迭代
三.五种I/O模型
四.select和epoll区别:
selecy 和epoll。功能类似,用IO复用。允许进程提示内核等待多个事件的任何的其中一个发生,并只有在一个或者多个事件发生或经历后,才唤醒它。
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
需要使用描述符集来指定fd_set参数值,如下四个宏:
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
fd_set *exceptfds, struct timeval *timeout);
需要使用描述符集来指定fd_set参数值,如下四个宏:
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
最大描述符固定!
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
这样只需管理pollfd结构体,如分配一个数组,而不用关系最大描述符问题。