2、TCP协议基础

TCP协议基础

1、3次握手建立连接

SYN表示建立连接的标志位,ACK为应答标志位

客户端 服务器 SYN 1000(0)(包号,(包携带的数据大小))<数据上限> SYN 8000(0),ACK 1001(序号1001表示1001之前数据全部收到) ACK 8001(0) 客户端 服务器

以上三个箭头就是三次握手,accept和connect成功返回,表示三次握手已经成功

2、数据通信

客户端 服务器 1001(20),ACK 8001(ACK表示三次握手成功) 8001(10),ACK 1021 ACK 8011 客户端 服务器

注意:不是每通信一次就要做出ACK应答,可以批量做出应答

3、四次握手关闭连接

客户端 服务器 FIN 1021(0) ACK 8011 ACK 1022 进入半关闭状态,写缓存区关闭 FIN 8011(0) ACK(1023) ACK 8012 客户端 服务器

​ 有4次握手的原因:半关闭

​ 半关闭后可以继续发送ACK应答:因为连接还存在,只是关闭了写缓存区

4、滑动窗口和数据包格式

​ 主要是为了防止数据丢失,告诉客户端缓存区有多少容量,让客户端发送时注意。

2、TCP协议基础_第1张图片

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;
		else
			perr_exit("accept error");
	}
	return n;
}

​ 系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。

你可能感兴趣的:(网络编程黑马程序员,tcp/ip,网络协议,网络)