学习笔记——TCP协议
TCP建立连接的目的:
tcp协议传输数据的前提:TCP连接已经建立。那么为什么需要建立这个连接呢
每个tcp片段都有序号(sequence number),序号字段值表示所要传送本报文中第一个字节的序号。若第一个报文有起始序号seq为x,然后传输的数据为100字节,那么这个机器下一个发送的报文序号seq为x+101。若该报文没有数据,那么它下一个报文的seq为x+1。
建立连接最主要的目的:就是让连接的双方交换初始序号。
把第一个报文的序号设置成1,是不是就可以不用连接了嘛?
这是出于安全考虑:如果确定的数字做为tcp初始化序号,那么其他人便很容易算出下一个序号的数值,然后伪装成tcp 片段。
所以tcp的初始化序号是连接的双方各自随机生成的,然后再通过tcp连接让对方知道。
三次握手连接建立过程:
(图片备注:syn=1,ack=1表示置位,将syn置位1,ack置位1。seq表示序号,ack表示确认序号)
client:client发送syn置位的报文,seq为随机生成的x。此时client进入SYN_SENT状态(TCP状态机)。
server: server收到syn报文,对该报文进行确认,构造syn,ack报文,并发送。此时seq为随机生成的y,ack为x+1,此时server进入SYN_RCVD状态。(ack表示期待收到的下一个报文的序号)
client:client收到syn,ack报文,并发送ack置位的报文。ack为y+1,此时状态为ESTABLISHED。(期待下一个报文的序号为y+1)
server:server收到ack报文,进去ESTABLISHED状态。
TCP的确认机制:
ack报文:是对接收到的数据的最高序号的确认,并向发送端返回期待的下一个tcp片段的序号(acknowledgment number)。若接收到一个序号为100,数据字节为200的报文,那么接收方将返回一个确认号为301的报文给发送方。
该机制在通信过程中,可以不必对每一个tcp数据报文都发送一个确认报文。一种是:可以在传输数据时,顺便把确认信息传出,大大提高网络的利用率和传输效率。另一种:可以一次确认多个数据报文,接收了序号为100,200,300的数据报文,只对300进行确认即可,这样表示之前的报文均已确认,提高系统的效率。
异常情况:
发送方若在tcp超时前没有收到确认信息,并会进行重传。
若接收方收到报文有差错,则丢弃报文,并不发送确认信息。
接收方收到重复报文,必须发送确认,否则对方会再次发送。