tcp四层网络模型
TCP与UDP在概念上的区别:
udp:(数据发出即可,不管服务端是否收到数据,类似rocketmq的sendway模式)
a、是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接
b、每个数据报的大小在限制64k内
c、因无连接,是不可靠协议
d、不需要建立连接,速度快
tcp:(需要三次握手四次挥手,保证传输数据的可靠性)
a、建议连接,形成传输数据的通道.
b、在连接中进行大数据量传输,以字节流方式
c 通过三次握手完成连接,是可靠协议
d 必须建立连接m效率会稍低
UDP服务器端代码:
public class UdpServer {
public static void main(String[] args) throws IOException {
System.out.println("udp接受数据启动.......");
DatagramSocket ds = new DatagramSocket(8082);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 阻塞效果
ds.receive(dp);
System.out.println("来源:"+dp.getAddress().getHostAddress()+",port:"+dp.getPort());
String str = new String(dp.getData(),0,dp.getLength());
System.out.println("客户端发送数据:"+str);
ds.close();
}
}
UDP客户端代码:
public class UdpClient {
public static void main(String[] args) throws IOException {
System.out.println("udp 发送数据");
DatagramSocket ds = new DatagramSocket();
String str = "客户端发送数据....";
byte[] strByte = str.getBytes();
DatagramPacket dp = new DatagramPacket(strByte, strByte.length, InetAddress.getByName("192.168.25.111"), 8082);
ds.send(dp);
ds.close();
}
}
TCP握手协议:
在TCP/IP协议中,TCP协议采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=J+1),同时自己也发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器V状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
四次分手:
public class TcpServer { public static void main(String[] args) throws IOException { System.out.println("socket服务器端启动...."); ServerSocket serverSocket = new ServerSocket(8083); //获取客户端对象 Socket accept = serverSocket.accept(); //会发生第一次阻塞 InputStream inputStream = accept.getInputStream(); byte[] buf= new byte[1024]; //会发生第二次阻塞 int len=inputStream.read(buf); String str =new String(buf,0,len); System.out.println("str:"+str); serverSocket.close(); } } |
客户端代码
System.out.println("socket启动...."); Socket s = new Socket("192.168.25.111", 8083); OutputStream outputStream = s.getOutputStream(); outputStream.write("我是客戶端....".getBytes()); s.close(); |