TCP协议(ACK/SN/ASN)

目的端口用来分用,首部长度用来解包

特点:
1.可靠性
2.面向流
3.有连接

TCP为了保证可靠性而使用的一些机制:
1.可靠性的第一种表述:
确认应答机制:ACK
作为发送方,希望知道我的数据是否被接收方收到:
通过序号(SN)+确认序号(ASN)知道收到的是哪句话
ACK表示确认序号是否有效
1.发送的每个数据都带着SN
2.如果数据中的ACK被置为1,表示该TCP包有确认含义(发送数据和确认含义共用的)
3.ASN可以计算出收到了哪些数据

实际上,一个TCP的通信过程中,只有第一个Segment的ACK没有置为1,其他全部含有ACK含义(因为对于TCP连接中任何Segment都需要应答,除了ACK(应答)本身,应答本身没有数据不需要应答)
ASN的细节含义:希望发送端发送的下一个字节的序号
在这里插入图片描述
几个字段:
在这里插入图片描述
URG:Urgent 紧急+配合16位紧急指针用
PSH:Push 建议不缓冲这份数据
校验和:检查数据正确性

再谈ACK机制和SN/ASN

前置知识:数据在网络上的传输过程中不一定走相同的路线
在这里插入图片描述
发送方发送数据时按顺序发送,接收时不一定按顺序,那么如何保证接收方收到有序的数据呢?
根据SN,可得到正确顺序的数据

超时重传
发送方发送数据一段时间后,没有收到应答就认为数据出问题了,就会再次发送数据
但是,接收方可能是没有收到数据,也可能是应答发送失败

超时:就是指超过了这个估计的一段时间
(超时时间是动态的,根据网络情况跳转,一般是遇到丢包,超时时间翻倍)
重传:就是把没有收到应答的数据再重新发送一遍

如果是应答发送失败,接收方又收到了重复的数据,可以根据SN去除收到的重复报文

TCP主要是围绕可靠性来谈:
数据不出错——校验和
确保发送的数据对方收到——确认应答机制
确保发送的数据对方按序收到——SN

SN的三个作用:
应答
排序
去重

发送和接收缓冲区
TCP有发送缓冲区和接收缓冲区
1)为什么要有接收缓冲区?
因为我发送的数据有可能需要重传,TCP需要暂时保存这些数据
2)为什么要有接收缓冲区?
因为数据可能是无序到达的,还因为数据到达后应用层不一定马上取走。
TCP的缓冲区在TCP协议栈里

根据应用层代码理解:
1.执行os.write(…):发送成功,只代表数据被写入到TCP协议栈的发送缓冲区了,不代表数据发送到网络上,更不代表对方收到数据。
2.执行is.read(…):如果接收缓冲区中有准备好的数据(有数据并且不能是空洞的)直接返回;如果没有收据,则会一直阻塞,直到数据准备好。阻塞的过程可能很久
3.byte[] buf=new byte[1024];
int len=is.read(buf,0,1024);
应用层准备好了1024的空间,最多可以接收1024字节的数据;
应用层不一定能读到1024数据,实际读到的数据长度是len。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值