目录
4.SN在发送TCP Segment 的 Header 中如何体现
TCP的可靠性是通过以下这几点实现的:
1.TCP会尽量把数据发送给对方,但不保证100%
2.TCP的数据如果发送不成功,会给发送端应用层错误通知,这个时候应用层就知道数据丢失了
3.TCP可以保证接收方的应用层严格按照发送时的数据顺序接收
4.TCP保证数据不会无意损坏(UDP也可以)
5.TCP尽可能地在维护网络质量
ack代表确认信息,当对方收到信息后,便会将ack发送回发送端,这个时候就直到数据成功传过去了。
当我们发送数据时,发的肯定是某一段数据,这个时候只需要把需要传递的数据的序列号开头传过去就可以。
SN 也就是发送的数据编号开头
ASN 确认的数据编号,这个信息一般由接收方二次发送回来,代表着发送端的下次开头编号,便于下次发送端发送数据。
一般不从0开始,因为太容易被坏人劫持,太好猜
一般我们的payload都是byte[]数组,所以我们基本一个字节占用一个编号
TCP 发送和接收的完整数据内容一般称为Segment(段),也就是header和payload的总和
我们一次会发送多个数据,又因为byte[]数组的连续性,所以我们SN直接填写本次发送数据的第一个字节的数据编号即可。
在Header中,我们会保存payload中第一个字节的数据(SN编号),这样编号就变得可用了,在我们发送的时候,发送这个字节数据即可,segent会承担payload的长度
1.在header中,就是32位确认序号那一栏
2.ASN表示要接收的下一个字节的数据,把它传回给发送端,发送端就知道发什么了
ISN指数据的第一个字节编号,一般不会从0开始,这是处于安全角度考虑,以防恶意用户推测出合法的SN值来加以利用。
segement就是上图的完整内容合并,它不仅可以担任send的角色,当我们标志位开关被打开时,也具有acknowledge segment的功能。
header中是含有标志位的,每个标志位我们就想象成一个开关,开关打开,就具备了响应功能
重传分为以下两种情况
1.有可能是数据还在路上
2.有可能数据已经丢失了
1.有可能还在路上
2.丢失
我们可以通过设定合理超时时间,解决在路上的问题,我们可以多等一会儿,再不来,那就只可能是丢失了。
无论是数据已经丢包,还是数据正在半路,只要超时没有收到ack,我们都可以选择无脑重发数据
当尝试几次重发后还是收不到ack,我们就停止发送。这里TCP已经用自己最大努力了
接下来,可以这样操作:
1.通知应用层,发送失败(一般在write()中就会抛出异常)
2.尽自己最大努力再尝试联系一下(reset segment) :最后的尝试,没收到也就没收到了
TCP是有发送缓冲区的,因为我也不知道能不能发送成功,所以需要暂时保留数据,以防万一
一旦数据放到本机的TCP发送缓冲区,就证明算是发送成功了
TCP同样有接收缓冲区,用法和UDP一个意思
连接是抽象概念,说白了就是两台主机的相互连接,可以进行信息交互
当我们连接起来,有这么几个阶段:
握手(连接建立) -> 使用 -> 挥手(连接断开)
握手是一个双方信息互相同步的过程
一般发送方先发送同步请求,由接收方接收后,再放回来发送同步请求和ack,这样,双方就连接起来并且可以互通数据了
同样在header标志位中,打开开关,即可同步
当我们第一次建立同步时,是不可以携带数据的,因为不知道能不能连接上
虽然不携带数据,但syn同样会消耗序列号
上述中描述我们可以看出,两端之间有三次的互通过程,之后可以正常使用,这个就叫做三次握手
我觉得老师的总结已经很到位了
就是当我发送端发syn的时候起,接收方就会被打开,然后进行我们的三次握手过程就完事了