Android Studio --- > [学习笔记]TCP(第2弹)、GridView、ScrollView

说明

  • 这篇主要接上一篇Android Studio — > [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手
  • 对上面回答的细解,并用JS伪代码,对TCP三次握手和四次挥手的简单实现.
  • Android的基本了解到此篇结束,后续会根据具体情况深度学习.

2.y TCP的三次握手和四次挥手(第2弹)

  • 参考
  • 下面娓娓道来(逐字敲)上一篇提出问题的解析

2.y.1 三次握手

  • 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息.

  • 刚开始客户端处于Closed的状态,服务器处于Listen状态.进行三次握手:

    • (1)第一次握手: 客户端给服务端发一个SYN报文,并指明客户端的初始化序列号ISN©.此时客户端处于SYN_SENT状态;首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号
    • (2)第二次握手: 服务器收到客户端的SYN报文后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(s)。同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN_RCVD的状态;在确认报文段中SYN=1,ACK=1,确认号ack=x+1(表示希望收到下一个的序号),初始序号seq=y
    • (3)第三次握手:客户端收到SYN报文之后,会发送一个ACK报文,当然,也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务端的SYN报文,此时客户端处于ESTABLISHED状态。服务器收到ACK报文之后,也处于ESTABLISHED状态,此时,双方已建立起了连接;确认报文段ACK=1,确认号ack=y+1,序号seq=x+1,ACK报文段可以携带数据,不携带数据则不消耗序号
  • 发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open).

  • 在socket编程中,客户端执行connect()时,将触发三次握手。

2.y.2 为什么需要三次握手,两次不行吗?

  • 为了弄清这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的.

    • (1)第一次握手: 客户端发送网络包,服务端收到,这样服务端就能得出结论 -> 客户端的发送能力、服务端的接收能力是正常的
    • (2)第二次握手: 服务端发包,客户端收到了,这样客户端就能得出结论: 服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
    • (3)第三次握手: 客户端发包,服务端收到,这样服务器就能得出结论: 客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
  • 因此,需要三次握手才能确认双方的接收与发送能力是否正常。

  • 如果是用两次握手,则会出现下面这种情况:

如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是再某些网络结点长时间滞

你可能感兴趣的:(Android,Studio,配置,读书笔记,网络,TCP,android,android,studio,javascript)