学习笔记——TCP协议

来源:互联网 发布:ubuntu如何挂载磁盘 编辑:程序博客网 时间:2024/06/05 03:48

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超时前没有收到确认信息,并会进行重传。

               若接收方收到报文有差错,则丢弃报文,并不发送确认信息。

               接收方收到重复报文,必须发送确认,否则对方会再次发送。

原创粉丝点击