TCP协议基础
1、3次握手建立连接
SYN表示建立连接的标志位,ACK为应答标志位
以上三个箭头就是三次握手,accept和connect成功返回,表示三次握手已经成功
2、数据通信
注意:不是每通信一次就要做出ACK应答,可以批量做出应答
3、四次握手关闭连接
有4次握手的原因:半关闭
半关闭后可以继续发送ACK应答:因为连接还存在,只是关闭了写缓存区
4、滑动窗口和数据包格式
主要是为了防止数据丢失,告诉客户端缓存区有多少容量,让客户端发送时注意。
5、TCP通信时序
三次握手:
主动发起请求,发送SYN标志位,请求建立连接。携带数据包包号、数据字节数(0)、滑动窗口大小
被动接收连接请求端:发送ACK标志位,同时携带SYN请求标志位。携带序号,确认序号、数据字节数,滑动窗口大小。
主动发起连接请求端,发送ACK标志位,应答服务器连接请求。携带确认序号。
四次挥手:
主动关闭连接请求端,发送FIN标志位。
被动关闭连接请求端,应答ACK标志位。 -----半关闭完成
被动关闭连接请求端,发送FIN标志位。
主动关闭连接请求端,应答ACK标志位。
滑动窗口:
发送给连接端,本端的缓存区大小,保证数据不会丢失。
6、错误处理函数的封装
例如:
int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)
{int n;again:if ((n = accept(fd, sa, salenptr)) < 0) {if ((errno == ECONNABORTED) || (errno == EINTR))goto again;elseperr_exit("accept error");}return n;
}
系统调用的错误都存储于 errno
中,errno
由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。