자바 소켓 프로그래밍(Network Socket Programming)

네트워크에서는 크게 두가지 프로토콜이 있습니다. TCP와 UDP가 그것들이죠. TCP는 연결형에 신뢰성을 바탕을 둔 전송 프로토콜이고, UDP는 비연결성의 비신뢰성의 프로토콜입니다. 여기서 왜 TCP가 신뢰성이 있냐면 패킷 유실시에 다시 재전송을 하기 때문이죠. UDP는 그런게 없이 잃어버리든 말든 재전송따위는 없이 보냅니다. 

여기서는 자바를 통해 TCP를 이용해 서버와 통신하는 프로그램을 구현해보도록 하겠습니다. TCP를 통해서 프로그래밍을 할땐 Socket에 관한 이해가 필요한데, 아래의 링크를 통해서 개념을 잡고 오세요. 설명은 리눅스 C 소켓 프로그래밍을 설명하지만 기본 개념은 같습니다.

reakwon.tistory.com/81

 

[리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용)

소켓(socket) 네트워크 통신을 하는 표준 방법으로 프로세스간 연결의 종점이라고 볼 수 있습니다. 기본적인 개념은 아래의 그림과 같습니다. 위의 그림은 TCP/IP에서의 인터넷 통신을 보여줍니다.

reakwon.tistory.com

 

서버-클라이언트 모델을 사용하기 때문에 서버용 프로그램과 클라이언트용 프로그램 두가지 메인 프로그램이 필요합니다.

Client는 GUI로 화면에 출력하고 서버는 Console 출력화면을 사용하도록 하겠습니다. 

 

서버 구현

Socket에 대한 개념을 충분히 이해하셨다면 이제 코드만 이해하면 됩니다. 아니, 방법만 알면 됩니다. 서버쪽에는 ServerSocket이라는 클래스를 이용하여 이것으로 클라이언트 연결이 올때까지 대기합니다. accept() 메소드가 바로 클라이언트 연결을 대기하는 메소드이고 연결이 성립될때까지 대기(컴퓨터 과학에서는 Block 된다고합니다.)합니다. accept는 연결이 되면 실제 통신하기 위해 Socket 객체를 넘겨주며 넘겨받은 Socket으로 실제 통신을 한다고 생각하시면 됩니다. 

그러니까 정리하자면 ServerSocket(개인적으로 부모 Socket이라 부릅니다.)은 Client를 받기 위한 소켓이고, 실제 데이터 송수신하는 소켓은 ServerSocket이 accept()하고 넘겨준 Socket(개인적으로 세끼 Socket이라고 합니다.)이라는 것이죠. 

아래의 코드는 포트번호 9999를 사용하며, 연결이 오면 소켓의 정보를 출력해주고 클라이언트에게 "Hello!! From Server"라는 메시지를 보낸 후 통신을 끊는 아주 간단한 서버의 코드입니다.

 

- TCPServer.java

public class TCPServer {
	
	public final static int SERVER_PORT=9999;
	public static void main(String[] ar) {
		ServerSocket ss=null;
		try {
			ss=new ServerSocket(SERVER_PORT);
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		while(true) {
			try {
				System.out.println("Waiting connection...");
				Socket s=ss.accept();		//새끼 Socket 넘겨줌
				System.out.println("[ Connection Info ]");
				System.out.println("client address:"+s.getInetAddress());	//클라이언트 IP주소
				System.out.println("client port:"+s.getPort());			//클라이언트 포트 번호
				System.out.println("my port:"+s.getLocalPort());		//나(Server, Local)의 포트
				
				PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
				pw.println("Hello!! From server");
			
				pw.close();
				s.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

클라이언트 구현

GUI 설정때문에 코드가 길어보이는 것뿐이니 사실 별거없습니다. 간단하게 클라이언트는 Swing 컴포넌트로 JTextArea에 Socket의 정보와 서버로부터 온 메시지를 출력해줍니다.  .정말 별거없죠? 

public class TCPClient extends JFrame{
	public final static int SERVER_PORT=9999;
	
	private Socket s;
	private JTextField messageField;
	private JTextArea messages;
	
	public TCPClient() {
		super(" TCP Client");
		messageField=new JTextField(40);
		messages=new JTextArea(10,50);
		
		messages.setBackground(Color.black);		//배경 검은색
		JScrollPane scrolledMessages=new JScrollPane(messages);	//스크롤 가능하도록
		
		this.setLayout(new BorderLayout(10,10));
		this.add("North",messageField);
		this.add("Center",scrolledMessages);
		
		messages.setEnabled(false);		//TextArea disactive
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(620,400);
		this.setLocationRelativeTo(null);	//창 가운데 위치
		this.setVisible(true);
		
		
		connectServer();
	}
	
	public void connectServer() {
		String serverIP="127.0.0.1";
		
		try {
			Socket s=new Socket(serverIP,SERVER_PORT);
			messages.append("server port:"+s.getPort()+", my port:"+s.getLocalPort()+"\n");
			BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
			messages.append(br.readLine());
			
			br.close();
			s.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String []ar) {
		new TCPClient();	
	}
}

 

위의 IP주소는 127.0.0.1인 이유는 저의 주소를 그대로 사용하게 만들도록 하기 위함입니다. 클라이언트는 포트번호 9999로 서버 소켓에 연결합니다. 아래는 서버와 클라이언트를 실행한 화면입니다. 

서버부터 실행하고 다음 클라이언트를 실행해야합니다. 서버와 클라이언트의 소켓정보가 일치됨을 확인할 수 있고 클라이언트는 서버로부터의 메시지를 잘 받아왔네요.

 

 

에코 서버-클라이언트 구현

클라이언트의 메시지를 그대로 돌려주는 서버를 우리는 에코 서버(Echo Server)라고 합니다. 그것을 구현해볼껀데요. 여기서 서버는 ServerSocket으로 새로운 통신을 확립시키면 새끼 Socket을 새로운 통신 쓰레드에 넘겨주며 작업을 처리하게 할것이고 다음 연결을 대기하게 만듭니다. 쓰레드와 소켓이 보통 같이 구현됩니다.

서버 구현


public class TCPServer {
	
	public final static int SERVER_PORT=9999;
	public static void main(String[] ar) {
		ServerSocket ss=null;
		try {
			ss=new ServerSocket(SERVER_PORT);
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		while(true) {
			try {
				System.out.println("Waiting connection...");
				Socket s=ss.accept();		//새끼 Socket 넘겨줌
				
				new ServerThread(s).start();
				
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
}

class ServerThread extends Thread{
	
	private Socket s;
	private BufferedReader br;
	private PrintWriter pw;
	public ServerThread(Socket s) {
		this.s=s;
		try {
			br=new BufferedReader(new InputStreamReader(s.getInputStream()));	//Socket으로 Read용 Stream
			pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));	//Socket으로 Write용 Stream
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		
		while(true) {
			String received;
			try {
				received = br.readLine();	//1. 받고
				System.out.println("server received :"+received);
				if(received==null||received.equals("quit")) {	//quit 또는 q가 오면 종료
					if(br!=null) br.close();
					if(pw!=null) pw.close();
					if(s!=null) s.close();
					return;
				}
				
				pw.println("Server Got Your Message : "+received);	//2. 보냄
				pw.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

ServerThread의 생성자에서는 소켓을 넘겨받고 사용할 인풋,아웃풋 스트림을 생성합니다. 그리고 run() 메소드에서 이런작업을 진행하지요. 

 

1. 우선 클라이언트로부터 메시지를 읽어옵니다. 이때 BufferedReader를 사용하죠.

2. 메시지를 검사하고 다시 클라이언트로 서버의 메시지를 첨가해 다시 넘겨줍니다. 이때 PrintWriter를 사용합니다. 여기서 한가지 하는 실수가 뭐냐면 PrintWriter는 내부적으로 버퍼를 사용하기 때문에 버퍼가 다 차기전까지 내용을 출력하지 않습니다. 그래서 강제로 비워줘야하는데, 그 메소드가 flush()입니다. 이전의 맨 처음 코드에서 flush()를 하지 않은 이유는 PrintWriter의 close()메소드가 버퍼를 비우고 스트림을 닫기 때문에 굳이 flush()를 호출할 필요가 없었죠. flush()는 변기물을 내리는 것처럼 버퍼를 흘려보내서 비워준다는 뜻입니다.

 

혹은 이렇게 이렇게 꼭 flush()를 하기 귀찮고 자동으로 flush()해주기를 원한다면 아래의 생성자를 사용하세요.

pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true);
PrintWriter(OutputStream out, boolean autoFlush)
Creates a new PrintWriter from an existing OutputStream.

두번째 인자는 auto flush를 하느냐 마냐를 정해줍니다. true면 auto flush활성화하는것입니다.

 

클라이언트는 이와 반대의 순서로 메시지를 보내고, 읽어야겠죠? 

클라리언트 구현

public class TCPClient extends JFrame implements KeyListener{
	//...생략...//
	@Override
	public void keyTyped(KeyEvent e) {}

	@Override
	public void keyPressed(KeyEvent e) {}

	@Override
	public void keyReleased(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if(keyCode==KeyEvent.VK_ENTER) {
			try {
				if(br==null||pw==null) return;
				String msgText=messageField.getText();
				if(msgText==null||msgText.length()==0) return;
				
				if(msgText.equals("quit")) {	//종료
					if(br!=null) br.close();
					if(pw!=null) pw.close();
					if(s!=null) s.close();
					return;
				}
				
				
				pw.println(msgText);	//1. 보내고
				pw.flush();
				messages.append(br.readLine()+"\n");	//2. 받음
				
				//뒷정리
				messageField.setText("");
				messageField.requestFocus();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}	
	}

 

나머지 불필요한 코드는 넣지 않았습니다. 사실 별로 어려운 소스코드는 아닙니다. 단지 소켓으로 인풋, 아웃풋 스트림을 생성한 후에 println()과 flush()로 문자열을 전송한 후에 다시 에코된 메시지를 readLine으로 읽는 겁니다.

 

이제 결과를 보시면 아래와 같이 잘 echo됨을 확인할 수 있습니다.

 

 

여기까지 Socket을 생성하여 연결하는 방법과 네트워크 전송에 사용하는 reader인 BufferedReader, writer인 PrintWriter에 대한 짤막한 사용법도 알아보았습니다.

 

이런 개념을 바탕으로 여러분들이 응용하기 나름이겠지만 채팅 어플리케이션도 만들 수 있고, 심지어 패인트 객체의 정보를 네트워크상으로 주고 받음으로써 캐치마인드까지도 구현해볼 수도 있습니다. 컴퓨터 프로그램에서 네트워크는 절대 빠질수 없는 개념이니 자바로 꼭 익혀두시길 바랍니다.

 

뭐, 시간되면 채팅 어플리케이션 만드는 포스팅도 진행해보도록 할게요. 그럴 시간이 나오려나...

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

TCP(Transmission Control Protocol)

IP 계층 위에서 동작하는 TCP는 연결 지향 프로토콜입니다. 마치 물리적인 선로로 연결되어 있는 것처럼 가상의 연결 통로를 설정하여 통신합니다. 그만큼 정확한 데이터 전송을 요구하며 신뢰성을 보장하기 때문에 신뢰할 수 있는 프로토콜(Reliable Protocol)이라고 합니다. 신뢰성 보장을 위해서 다음의 제어를 수행합니다. 

 

1) 흐름 제어(Flow Control)

데이터를 보내는 사람, 받는 사람이 있다고 할때 줄 수 있는 양, 받을 수 있는 양이 다릅니다. 그래서 상대방이 받을 수 있을 만큼의 양으로 적절히 전송하는 것을 흐름제어라고 합니다. 

 

2) 혼잡 제어(Congestion Control)

네트워크가 혼잡해지면 송신자가 데이터의 전송량을 제어하는 것을 뜻합니다. 혼잡하다라는 것을 어떻게 알 수 있을까요? 데이터의 손실 발생이 많아지면 이는 즉, 네트워크가 혼잡한 상태로 판단하여 전송량을 제어하게 됩니다.

 

3) 오류 제어(Error Control)

데이터의 오류나 손실없는 전송을 보장해주는 것이 혼잡 제어입니다. 오류 발생 시 TCP는 데이터를 제전송합니다.

 

 

 

 

 

TCP 헤더

TCP 프로토콜은 신뢰성을 보장하기 위해서 헤더에 많은 정보를 포함하게 되는데 각 필드에 어떤 정보를 포함하는지 알아보도록 하겠습니다.

TCP 프로토콜의 구조

 

- Source Port: 출발지의 포트, 즉 데이터를 보내는 컴퓨터의 포트 정보입니다. 컴퓨터가 갖을 수 있는 포트는 65536개이므로 사이즈가 2바이트인것을 확인하세요. 

 

- Destination Port: 반대로 목적지의 포트입니다. 

 

- Sequence Number : 송신 데이터의 일련 번호를 담고 있습니다. 

 

- Acknowledgement Number : 그전의 데이터를 잘 받았다는 표시로 상대방이 다음에 전송할 일련번호를 담고 있습니다. 줄여서 ACK라고 하겠습니다.

 

- HLEN(Header Length) : 헤더의 정보를 담고 있습니다. 4 bits의 워드 단위입니다. 헤더의 길이는 최소 20바이트 ~ 60바이트까지입니다.

 

- Reserved : 예약된 비트입니다. 아직 사용하지 않습니다. 나중을 위해서 남겨두는 비트인 셈이지요.

 

- Control Flags 

FLAG 설명

URG

(Urgent Pointer)

Urgent Pointer의 필드가 유요하다는 의미의 FLAG

ACK

(Acknowledgement)

수신 확인 응답 FLAG

PSH

(Request for push)

송수신 버퍼의 있는 데이터 즉시 처리 요청 FLAG

RST

(Reset the connection)

연결을 강제 중단합니다. TCP가 유지되고 있을때 이 FLAG를 사용하면 그 즉시 연결을 끊어 버립니다. 해커들이 Hijacking을 위해 피해자의 연결을 끊어버릴때 사용합니다. 보통의 정상적인 종료는 아래의 FIN FLAG를 설정합니다.

SYN

(Synchronize sequence number)

연결 설정 FLAG

FIN

(Terminate the connection)

정상 종료의 연결 종료 FLAG

 

- Window Size :  수신자에서 송신자로 보내는 수신자의 윈도우 사이즈입니다. 즉, 수신 버퍼의 여유공간 크기를 의미하게 되지요. 송신자는 이 윈도우 사이즈 범위 내에서 수신측의 수신 확인(ACK)을 확인하지 않고 연속적으로 데이터를 보낼 수 있습니다.

 

- Checksum : 오류를 검사하기 위한 필드입니다. 전체 데이터가 오류가 나 변형되었는지 확인합니다. 

 

- Urgent Pointer : 긴급 데이터의 위치값을 담고 있습니다. 

 

 

 

 

 

 

 

 

TCP의 연결 설정 과정(3-way handshake)

TCP연결은 어떻게 연결이 될까요? 3단계 절차에 따라서 연결이 성립됩니다. 이때 사용되는 FLAG는 2개입니다. 바로 SYN과 ACK입니다. 다음의 그림을 통해서 연결과정을 알아보도록 합시다.

 

3-way handshake

 

1. 최초 클라이언트 측에서 동기화를 위해 SYN FLAG와 함께 Seq(uence) Number를 임의로 설정해서 보내줍니다. 이때 최초의 Seq number를 ISN(Initial Sequence Number)라고 합니다.

아직 상대방에게서 데이터를 수신하지 않았으므로 Ack(nowledgement) Number 필드는 비어있네요. SYN 패킷을 보냈으므로 클라이언트의 상태는 SYN_SENT가 됩니다. 서버는 SYN을 받았으므로 SYN_RECV 상태 또는 SYN_RCVD상태가 됩니다.

 

이때 클라이언트가 적극적으로 연결 요청을 하고 있네요. 이것을 Active Open이라 합니다. 서버는 수동적으로 받아들이고 있네요. 이것을 Passive Open이라고 합니다.

 

2. 서버에서 동기화 요청을 받았으면 잘 받았으니 연결하자고 요청합니다. 클라이언트에서 보낸 Ack number에 받은 Seq에 +1을 하여 다음 Seq Number를 요구합니다. 클라이언트의 Seq number가 100이므로 101을 Ack number로 보내는 군요. 또한 자신도 역시 ISN을 설정하여 다시 클라이언트로 보냅니다. 

이때 사용한 플래그는 ACK와 SYN입니다. ACK와 SYN이 유요한 데이터이기 때문이죠. 이 페킷을 보낸 후 서버는 연결 확립(ESTABLISHED)상태가 됩니다. 

 

3. 클라이언트는 이에 대한 응답으로 서버에게 ACK num을 설정하여 보냅니다. 이 패킷을 준 후 클라이언트도 연결 확인 상태가 됩니다.

 

이렇게 보면 초기에 데이터가 왔다 갔다 3번하고 있죠? 이것을 3-Way Handshake라고 합니다.

 

아래는 실제 3 way handshake를 와이어샤크로 찍어본 화면입니다.

wire shark hand shake

 

 

연결 종료(4-way handshake)

정상적인 연결 종료는 FIN, ACK의 플래그를 통해서 이루어집니다. 아래와 같이 4단계를 거쳐 연결이 종료가 됩니다. 

1. 연결상태에 있던 클라언트가 연결을 종료하기 위해 FIN을 보냅니다. 이때 클라이언트의 상태는 FIN_WAIT_1 상태가 되고 서버는 CLOSE_WAIT 상태가 됩니다. 3 way handshake와 마찬가지로 먼저 close요청을 한쪽이 Active Close, 받은쪽이 Passive Close라고 합니다.

 

2. 수신하는 서버는 이에 대한 응답으로 ACK를 보냅니다. 이때 클라이언트는 FIN_WAIT_2의 상태가 됩니다.

 

3. 서버는 이 후 소켓을 받는 시스템 콜(close)을 호출할때까지 대기 상태로 있다가 소켓이 종료되면 FIN을 보냅니다. 마지막 FIN과 함께 ACK를 보냈으므로 LAST_ACK 상태가 됩니다.

 

4. 서버로부터 FIN을 받은 클라이언트는 ACK응답을 하여 2MSL만큼의 시간(보통 1분에서 4분)이후 연결 종료 상태(CLOSED)가 됩니다. 서버 CLOSED상태가 되어 연결이 종료됩니다.

 

이러한 과정을 4-way handshake로 연결이 정상적으로 연결이 종료되는 과정입니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

TCP/IP

인터넷 프로그램들이 서로 통신을 하는데 있어서 여러 프로토콜이 있습니다. 인터넷 프로토콜에서 가장 많이 사용하는 대표적인 프로토콜은 여러분들도 많이 아시다시피 IP입니다. 여기서 중요한 것은 TCP/IP는 계층이 아니라 프로토콜이라는 사실이라는 사실을 주의해주세요.


TCP/IP는 OSI7 계층과는 조금은 다른 TCP/IP의 구조적인 계층 위에서 동작합니다.


지난 번에 OSI7 계층에 대해서 알아보았는데요. TCP/IP 계층은 OSI7계층과 비교하여 어떤 점이 다른지 살펴보는 시간을 가져보도록 하지요.






OSI7 계층과는 조금은 다른 모습을 볼 수 있습니다. 보세요.

우선 계층의 수 부터가 다릅니다. OSI는 7계층인데 반해 TCP/IP 계층은 4계층이 전부라는 것을 알 수 있습니다.


이제 조금 더 세세하게 살펴보도록 하지요.




1. 네트워크 인터페이스 계층 (Network Interface Layer)

이 계층은 Node-To-Node간의 신뢰성 있는 데이터 전송을 담당하는 계층입니다. OSI7 계층의 물리 계층과 데이터링크 계층의 역할을 바로 이 계층이 담당하는 것으로 볼 수 있네요.


따라서 MAC주소가 이 계층에서 사용됩니다. MAC주소는 OSI7 계층에서 데이터링크 계층의 주소였죠?? 


네트워크 인터페이스 계층이 바로 데이터링크 계층까지 담당하니까 MAC 어드레스가 사용되는 겁니다.


혹시 랜카드라고 들어보셨나요? 바로 이거말이에요.




정확한 명칭은 NIC라고 하여 Network Interface Card입니다. 바로 이 랜카드가 있어야만 네트워크 통신을 할 수 있는데, 이름에서도 알 수 있듯이 네트워크 인터페이스 계층에서 동작하는 장비입니다.


주요 프로토콜을 무엇이 있을까요?

LAN상에서는 Ethernet, TokenRing, FDDI 등이 있으며 WAN 상에서는 X.25, Frame Relay, PPP 등이 있습니다.


2. 인터넷 계층 (Internet Layer)

OSI7계층의 네트워크 계층을 담당하는 계층입니다. OSI7 계층처럼 호스트간의 라우팅을 담당하지요. 


인터넷 계층에서 동작하는 프로토콜에는 무엇이 있을까요? 대표적인 몇가지 프로토콜을 살짝 알아보도록 합시다.


IP(Internet Protocol) : 비신뢰성, 비연결지향 데이터그램 프로토콜입니다. 

ARP(Address Resolution Protocol) : 주소변환 프로토콜입니다. IP주소를 MAC주소로 변환하는 프로토콜이지요.

RARP(Reverse ARP) : 반대로 MAC주소로 IP주소를 찾는 프로토콜입니다.

ICMP(Internet Control Message Protocol) : 상태 진단 메시지 프로토콜인데요. 이 프로토콜을 이용하는 대표적인 프로그램이 ping입니다.

IGMP(Internet Group Message Protocol) : 멀티캐스트용 프로토콜입니다.




3. 전송 계층 (Transport Layer)

OSI7 계층의 전송계층과 같습니다. 프로세스간의 신뢰성 있는 데이터 전송을 담당하는 계층입니다.


process-to-process 전송을 담당하기 위해서는 논리적 주소가 필요한데요. process가 사용하는 포트 번호를 그 논리적 주소로 사용합니다.


전송 계층에서 프로토콜은 무엇이 있을까요?


TCP (Transmission Control Protocol) : 신뢰성있는 연결지향형 프로토콜입니다. 신뢰성있다는 말은 그 페킷에 대한 오류처리나 재전송따위로 에러를 복구하는 것을 말합니다. 그때문에 TCP의 헤더에 붙는 정보가 많습니다.

UDP (User Datagram Protocol) : 비신뢰성 비연결형 프로토콜입니다. 페킷을 잃거나 오류가 있어도 대처하지 않는 것을 말합니다. 따라서 UDP헤더는 간단한 구조를 갖고 있습니다.



4. 응용 계층 (Application Layer)

사용자와 가장 가까운 계층입니다. OSI7계층의 5계층부터 7계층까지의 기능을 담당하고 있지요.

서버나 클라이언트 응용 프로그램이 이 계층에서 동작합니다. 우리가 알고 있는 브라우저나 텔넷같은 서비스가 이 계층에 동작하며, 동작하기 위해서는 전송계층의 주소, 즉 포트번호를 사용합니다.


이를테면 http는 포트번호 80번을 사용하지요.


역시 프로토콜은 무엇이 있나 살펴볼까요?


HTTP (Hyper-Text Transfer Protocol) : TCP기반의 프로토콜로 포트번호 80번을 사용합니다.

Telnet : TCP 포트번호 23번을 사용합니다. 원격 터미널을 접속할때 이 포로토콜을 사용합니다.

SSH (Secure Shell) : 텔넷과 같은 서비스는 보안에 취약합니다. 비밀번호가 암호화되지 않아 그대로 노출이 되기 때문이지요. 이것을 보완한것이 SSH입니다. 포트번호 22번을 사용합니다.

FTP(File Transfer Protocol) : 파일 전송 프로토콜입니다. 파일을 받거나 올릴때 FTP를 사용하지요. FTP는 파일을 올리거나 내려받을때 신뢰성을 중요시하기 때문에 TCP에서 동작하구요. 2개의 포트를 사용합니다. 

TCP 포트 20번은 데이터 전송을 위한 용도, TCP 포트 21번은 제어용으로 사용합니다.

SMTP (Simple Mail Transfer Protocol) : 메일 전송 프로토콜입니다. TCP 상에서 동작하며 포트는 25번을 사용합니다.

POP3 (Post Office Protocol Version3) : 메일 수신용 프로토콜입니다. 아웃룩같은 프로그램이 POP3라는 프로토콜을 사용하여 동작합니다. TCP 포트 110번을 사용합니다.

DNS (Domain Name System) : 도메인명에 대한 호스트 정보를 제공해줍니다. 기본적으로 UDP상에서 동작합니다. 기본적으로 실패하면 다시 한번 요청하면 되며 그렇게 중요한 정보가 아니기 때문이죠. 하지만 신뢰성을 요할 경우에는 TCP상에서도 동작합니다. 데이터의 길이가 길 경우같은 때 TCP 기반으로 동작할 수 있습니다.

UDP, TCP 포트 53번을 사용합니다.




이와 같이 포트번호가 특정 프로토콜이 사용해서 우리가 쓸 수 없는 포트들이 있습니다. 이런 포트들을 well-known port라고 합니다.


프로토콜 헤더 정보를 잘 읽고 분석할 수 있다면 네트워크를 더 잘 이해할 수 있을 겁니다.


따라서 다음 시간에는 헤더를 보고 무슨 정보가 있는지 살펴보는 기회를 갖도록 하겠습니다.

반응형
블로그 이미지

REAKWON

와나진짜

,