2、TCP协议基础

TCP协议基础

1、3次握手建立连接

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

客户端 服务器 SYN 1000(0)<mss,1460>(包号,(包携带的数据大小))<数据上限> SYN 8000(0),ACK 1001<mss 1024>(序号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、滑动窗口和数据包格式

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

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由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值