TCP的一些基本概念
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流(当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流)的传输层通信协议。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
TCP传输涉及的对象与UDP不同,其需要通过三次握手确定连接的建立,建立连接之后进行数据的传输
连接建立——三次握手
TCP三次握手的过程如下:
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
连接断开——四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次握手,由于其是全双工,具体过程如下:
- 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
- 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认ACK。
- 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
- 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
TCP不同于UDP,是面向连接的,因此必须先开服务端
Socket和ServerSocket
- 建立客户端和服务器端
- 建立连接后,通过Socket中的IO流进行数据的传输
- 关闭Socket
Socket:此类实现客户端套接字,套接字是两台机器间通信的端点。
构造函数:
- Socket():通过系统默认类型的SocketImpl创建未连接套接字,可以new出对象,通过connect(SocketAddress endpoint)方法将此套接字连接到服务器,SocketAddress实际就是IP套接字地址(IP地址+端口号),也可以是(主机名+端口号),此种情况下会尝试解析主机名,如果解析失败,则改地址将被视为未解析地址。
- Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定IP地址的指定端口号
- Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
ServerSocket:此类实现服务端套接字。服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后可能想请求者返回结果。(一个服务端可以同时给多个客户端提供服务)
TCP客户端
TCP传输,客户端建立的过程
1.创建tcp客户端Socket服务,使用的是Socket对象(建议该对象创建时明确目的地,即要连接的主机)
2.如果连接建立成功,说明数据传输通道已经建立(底层帮助建立),这个通道实际就是一个流(输入流,输出流),Socket流(网络IO流)
Socket流是底层建立好的,既然是流,说明这里是既有输入,又有输出,想要输入或者输出流对象,可以找Soc