Socket,也称
套接字
,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。程序之间的网络通讯是要通过端口来区分的。简单来说,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,而建立网络通信连接至少要一对端口号(socket)。
1、Socket与TCP/IP
Socket本质是对TCP/IP的封装,是一套用来实现TCP或UDP通讯的API。 根据网络通讯的OSI参考模型的定义,IP位于网络层,TCP/UDP位于传输层,HTTP位于应用层,而Socket位于传输层和应用层之间,是它们之前的桥梁。
2、TCP/IP特性
- TCP传输协议:TCP是面向连接的,需要“三次握手,四次挥手”,是可靠的传输,用来传输大的数据,但是,建立时间要花费时间和资源,相对于UDP速度较慢。
- UDP:UDP是面向无连接的,发送端不会关心数据是否到达目标端,简单高效。经常用于以下几方面:
1、总量较小的通讯(DNS,SNMP等)
2、视频、音频等多媒体通讯(即时通讯)
3、限定于LAN等特定网络中的应用通讯
4、广播通讯(广播、多播)
3、Socket的TCP通讯流程
4、Socket的UDP通讯流程
Scoket-TCP/UDP通信示例: ScoketDemo
5、TCP三次握手、四次挥手流程
-
三次握手:
1、
client
向server
发起请求链接(connect),首先发送SYN
报文,SYN=1
,seq=x
,并且client
进入SYN_SENT
状态
2、server
收到请求链接,server
向client
进行回复(accept),并发送响应报文,SYN=1
,seq=y
,ACK=1
,ack=x+1
,并且server
进入SYN_RECD
状态
3、client
收到确认报文后,向server
发送确认报文,ACK=1
,ack=y+1
,此时client
进入到ESTABLISHED
,server
收到client
发送过来的确认报文后,也进入到ESTABLISHED
状态,此时链接创建成功
根据上述的Scoket-TCP通信流程更容易理解三次握手
-
四次挥手
-
client
向server
发起关闭链接,并停止发送数据 -
server
收到关闭链接的请求,向client
发送回应,并且停止接收数据 - 当
server
发送数据结束之后,向client
发送关闭链接,并停止发送数据 -
client
收到关闭链接的请求时,向server
发送回应,然后停止接受数据
-
为什么需要三次握手:
为了防止已失效的连接请求报文段突然又传送到server
,因而产生错误
1、假设这是一个早已失效的报文段,但`server`收到此失效的连接请求报文段后,就误认为是`client`再次发出的一个新的连接请求.于是就向`client`发出确认报文段,同意建立连接
2、假设不采用“三次握手”,那么只要`server`发出确认,新的连接就建立了,由于现在`client`并没有发出建立连接的请求,因此不会理睬`server`的确认,也不会向`server`发送数据.但`server`却以为新的通信连接已经建立,并一直等待`client`发来数据.这样服务端的很多资源就浪费
-
为什么需要四次挥手:
因为TCP是全双工通信的,在接收到client
的关闭请求时,还可能在向client
发送数据,因此不能再回应关闭连接的请求时,同时发送关闭连接的请求