TCP&UDP&Socket

Tcp三次握手:


 

或者:



 

    如上,需要第三次握手的原因在于Server端在第二次握手(发出信息)后并不知道对方是否能够接收、己方的发送功能是否正常。但此时数据的单向通道已经建立,对于Client来说,已经确认了Server端可以接收信号,因此可以单向给Server发送数据了。

    示例:

    谍战片中,我方人员需要向我方站点传递敌军情报,因此通过各种方式(如刷一张寻物启事到贴到某个指定电线杆)向站点请求(由于不确定信号安全性,因此不能直接传输情报而要先确认双方安全)。请求中包含了某个神秘字符J。此为第一次握手。

站点通过指定方式收到请求后,表明站点安全(可接收情报)以及我情报人员可发出信息,在报纸上登出某个神秘的寻人启事。寻人启事中包含了神秘字符J+1,以及神秘字符K。此时站点并不知道自己的信息是否能被情报人员接收到。此为第二次握手。

我方人员买到报纸一看,J+1表示站点已可接收并发送情报,(自己也可发送)。但站点并不知道情报人员已经收到了它的信息,于是再次发出确认信息(贴电线杆),包含神秘字符K+1。此为第三次握手。连接建立。

    如果只有两次握手,则此时仅表明Server端可接收信息,即站点可收到情报人员之情报。这个可以用于常规情报的单向传递,无需请求站点给予指示。

至于为何没有第四次,因为通过三次握手双方已经互相确保了己方、对方都可以正常接收、发送信息了,无需第四次。

 

简单表达:

第一次:A发送给B:SYN

第二次:B发送给A:SYN+ACK

第三次:A发送给B:ACK

 

另一种解释:

1:A发,B收, B知道A能发
2:B发,A收, A知道B能发收
3:A发,B收, B知道A能收

 

另一种准确解释:

TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!

 

TCP可靠传输的精髓:TCP连接的一方A,由操作系统动态随机选取一个32位长的序列号(Initial Sequence Number),假设A的初始序列号为1000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,1001,1002,1003…,并把自己的初始序列号ISN告诉B,让B有一个思想准备,什么样编号的数据是合法的,什么编号是非法的,比如编号900就是非法的,同时B还可以对A每一个编号的字节数据进行确认。如果A收到B确认编号为2001,则意味着字节编号为1001-2000,共1000个字节已经安全到达。

 

同理B也是类似的操作,假设B的初始序列号ISN为2000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,2001,2002,2003…,并把自己的初始序列号ISN告诉A,以便A可以确认B发送的每一个字节。如果B收到A确认编号为4001,则意味着字节编号为2001-4000,共2000个字节已经安全到达。

 

一句话概括,TCP连接握手,握的是啥?通信双方数据原点的序列号!

 

TCP4次挥手:

所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:



 

  由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

 (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。



 

  上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:



 

  流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。

四、附注

  关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:

  (1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。

  (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACKSYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

 

 

 

 

 

 

UDP协议:

UDP(User Data Protocol,用户数据报协议)
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
UDP
的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位

小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;TCP是发送的是字节流,UDP是面向报文的模式
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

 

 

 

Socket与TCP、UDP、http的区别:

我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

 

 

JAVA TCP Socket编程模型:

 

 

猜你喜欢

转载自pigcircle-126-com.iteye.com/blog/2395480