dev
기타 (Etc)
TCP vs UDP 차이 (difference of TCP, UDP)
·
TCP, UDP의 각 특성을 비교하면서 알아보도록 하고, Java로 TCP, UDP를 사용하여 간단한 어플리케이션을 만들어 보도록하겠습니다.
TCP(Transmission Control Protocol)란?
TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서
실행되는 프로그램 간에 일련의 옥텟을 안정적으로,순서대로,
에러없이 교환할 수 있게 해주는 프로토콜이다.
- 연결 지향적이다.
- 신뢰성 있는 데이터 전송(reliable data transfer -> rdt)를 보장한다.
- Ordering. (순서를 보장한다.)
- Flow control 기능이 있다.(sender가 데이터를 너무 빨리 보내는 것을 제어)
- Congestion control 기능이 있다.(네트워크 상황에 따라 윈도우 크기를 조정)
- AIMD 방식으로 윈도우의 크기를 조절하여 WAN으로 나가는 패킷의 양을 조절한다.
- 종류로는 tahoe, reno, cubic 등이 있다.
- timing, throughput, 보안을 보장해주지는 않는다.
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket (5101);
Socket client = serverSocket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line.toUpperCase());
if (line.equals("quit")) break;
bw.write(line.toUpperCase() + "\n");
bw.flush();
}
br.close();
bw.close();
serverSocket.close();
client.close();
}
}
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1") , 5101);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line;
while (true) {
line = br2.readLine();
bw.write(line + "\n");
bw.flush();
if(line.equals("quit")) break;
System.out.println(line);
String answer;
while ((answer = br.readLine()) != null) {
System.out.println(answer);
}
}
bw.close();
br.close();
socket.close();
}
}
UDP(User Datagram Protocol)란?
TCP와 함께 데이터그램으로 알려진 단문 메시지를 교환하기 위해서 사용된다.
- 신뢰성 없는 데이터 전송 프로토콜이다.
- Datagram을 전송하는데에만 신경을 쓴다.
- Flow, Congestion, Ordering 어떤 것도 Control해주지 않는다.
- 그렇다면 UDP는 언제 사용하는가?
- 재전송이 필요없는 VoIP, 동영상 같은 경우에 사용이 가능하다. (잡음이 들렸다고 해서 다시 들어야하는 경우는 없다.)
- DNS, DHCP, UDP heartbeat 등에 사용한다.
public class UDPServer {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(5001);
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(datagramPacket);
String line = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(line);
if (line.equals("quit")) break;
DatagramPacket sendDatagramPacket = new DatagramPacket(datagramPacket.getData(),
datagramPacket.getLength(), datagramPacket.getAddress(), datagramPacket.getPort());
datagramSocket.send(sendDatagramPacket);
}
datagramSocket.close();
}
}
public class UDPClient {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(5002);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line;
while ((line = br.readLine()) != null) {
DatagramPacket sendPacket =
new DatagramPacket(line.getBytes(), line.getBytes().length,
InetAddress.getByName("127.0.0.1"), 5001);
datagramSocket.send(sendPacket);
if(line.equals("quit")) break;
byte[] buffer = new byte[line.getBytes().length];
DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(receivePacket);
String msg = new String(receivePacket.getData(), 0, receivePacket.getData().length);
System.out.println("전송받은 문자열 : "+ msg);
}
bw.close();
br.close();
datagramSocket.close();
}
}