传输方式:协议:TCP (传输控制协议)、UDP(用户报文协议)
网络四元组:本机IP,对方IP,本机端口,对方端口
TCP
1.TCP协议属于传输层协议,而我们写代码一般是直接使用封装好的tcp工具或者应用层协议来驱动传输层工作
如果我们想在JAVA语言中,驱动TCP协议来传输数据,那么我们可以使用JAVA封装好的工具Socket(套接字)编程实现JAVA给出的TCP套接字就是Socket,需要分清楚服务器和客户端的不同,服务器端使用的是ServerSocket,客户端使用的是Socket。
#### TCP状态迁移:
1.首先服务器端,必须先开启某一个端口的监听
2.由客户端向服务器的监听端口发起一个SYN请求,其中SYN等于一个数字,SYN = x
发送的时候,客户端需要选择一个自己的端口发送该SYN请求,一般来说,客户端选择的端口都是随机的
但是当选择完这个端口以后,就一直使用这个端口传输数据,在该连接没有断开之前,不会换端口
当发送完SYN请求以后,客户端的该端口状态变成了SYN_SENT状态。
3.当服务器端的监听端口,收到客户端发送的SYN=x这个数据的时候,自己的端口状态就变成了SYN_RECV
同时,向发送SYN的客户端的那个端口回复一个数据,这个数据,包含两条信息,一个是
SYN = y, 另一个是 ACK = x+1
4.当客户端收到服务器发过来的SYN + ACK 消息的时候,客户端就会将端口立刻变化成Establish状态
同时,客户端会发送一条数据给服务器,这个数据是ACK = y+1
5.当服务器收到客户端发来的ACK = y+1 的时候,服务器中的SYN_RECV状态就变成了Establish状态
6.当A发出FIN时,表示A不在会调用输出流了,但是并不表示A的输入流已经使用完成。
举例:
服务器
public class TCPServer {
public static void main(String[] args){
ServerSocket ss=null;
try {
ss=new ServerSocket(18888);
Socket s=ss.accept(); //接收
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
public class TCPClient {
public static void main(String[] args){
Socket socket=null;
try {
socket=new Socket("127.0.0.1",18888);
} catch (IOException e) {
e.printStackTrace();
}
}
}