# PORT와 응용프로그램 프로그램에서 포트는 논리적인 접속 장소이며, 특히 인터넷 프로토콜인 TCP/IP를 사용할 때에는 클라이언트 프로그램이 네트웍 상의 특정 서버 프로그램을 지정하는 방법으로 사용됩니다. 발신지에서 출발한 데이터는 각 계층을 거치면서 최종적으로 목적지 주소를 가진 컴퓨터에 도착하여 패킷에서 주소 필드를 제거하고 패킷 안의 데이터만을 응용프로그램에게 넘겨주게 됩니다. 여기서 실행중인 다양한 프로그램들 중 누구에게 데이터를 전달해야 하는지 구분하는 것이 바로 포트 번호입니다.
1. PORT가 같으면 응용프로그램이 같아질까? 아니다. 예를 들어 크롬과 줌 모두 [TLS/SSL 방식의 HTTP 통신]을 하는데, 여기서 두 프로그램의 포트 번호가 모두 443이라고 실행 중인 chrome.exe 와 Zoom.exe가 같은 응용프로그램이라고 할 수 없다.
resmon.exe에서 확인한 크롬과 줌의 포트번호
2. PORT가 달라도 응용프로그램이 같을 수 있을까? 같을 수 있다. 크롬의 경우 HTTPS 통신에 443 포트를 사용할 뿐만 아니라 유저 설정 정보를 동기화 하는 5228번 포트를 사용한다. 이 경우 포트가 다른데 응용프로그램이 같다고 볼 수 있는 것 같다.
resmon.exe에서 확인한 크롬의 포트번호들
TCP/IP
TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(unreliable datagram service) TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.
TCP 프로토콜은 느리지만 꼼꼼한 방식을 사용합니다. 도착한 데이터조각을 점검하여 줄을 세우고, 망가졌거나 빠진 조각을 다시 요청합니다.
IP 프로토콜은 데이터의 조각들을 최대한 빨리 목적지로 보내는 역할을 합니다. 데이터가 뒤바뀌거나 누락되도 크게 상관하지 않습니다.
TCP가 패킷을 추적 및 관리하여 정확도를 담당하고, IP가 빠른 속도로 데이터를 배달하는 조합을 통해 인터넷 데이터 통신을 하는 것을 묶어 TCP/IP라고 합니다.
TCP vs UDP
TCP와 UDP 모두 4계층인 전송 계층에서 사용하는 프로토콜입니다.
TCP (Transmission Control Protocol)
데이터를 메시지의 형태(Segment)로 보내기 위해 IP와 함께 사용하는 프로토콜입니다. TCP는 연결형 서비스로, 데이터를 전송하기 전에 논리적 연결이 설정되는 방식을 사용합니다.
높은 신뢰성을 가지고, 양방향 전송이 가능하며, 점대점(Point to Point : 2개의 종단점) 방식입니다.
흐름 제어를 제공하여 데이터 처리속도의 조절, 수신자의 버퍼 오버플로우를 방지할 수 있고, 혼잡제어를 제공하여 패킷수를 제어하는 기능이 있습니다.
결론적으로 연속성보다 신뢰성 있는 전송이 중요할 때 사용됩니다.
UDP (User Datagram Protocol)
데이터를 데이터그램(Datagram) 방식으로 처리하는 프로토콜입니다.
비 연결형 서비스 방식을 사용하여, 논리적 연결이 없고 각각의 패킷이 독립적이며 데이터를 서로 다른 경로로 모두 독립적으로 처리합니다.
데이터를 주고 받을 때 신호 절차(TCP의 3-way handshaking 등)가 별도로 없습니다.
결론적으로 TCP보다 속도가 빨라 신뢰성이 낮으나 연속성있는 전송이 중요한 상황에 사용됩니다.
3-Way Handshaking / 4-Way Handshaking
# SYN과 ACK - SYN : Synchronize sequence number - ACK : Acknowledgement
3-Way Handshaking : 세션 연결
양쪽 모두 데이터를 전송하고 받을 준비가 되었다는 것을 보장하고, 실제로 데이터 전달 시작 이전에 서로에게 다른 쪽이 준비되었다는 것을 알 수 있도록 합니다. 양 쪽 모두 이 과정에서 초기 순서번호를 얻을 수 있도록 합니다.
3-Way Handshaking
#1 : 클라이언트가 서버에 접속을 요청하는 SYN 패킷을 보냅니다. 이 때, 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태, 서버는 Wait for Client 상태입니다. #2 : 서버는 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 SYN+ACK 패킷을 발송합니다. 이 발송에 대해 클라이언트가 ACK로 응답하기를 기다리며 SYN_RECEIVED 상태가 됩니다. #3 : 클라이언트가 서버에게 ACK를 보내고 이후로부터는 연결이 이루어져, 데이터가 오갈 수 있게 됩니다. 서버의 상태는 ESTABLISHED가 됩니다.
위의 3단계로 통신하여 신뢰성 있는 연결을 맺는 것이 TCP의 3-Way Handshaking 방식입니다.
4-way Handshaking : 세션 종료
3-Way handshake가 TCP의 연결을 초기화 할 때 사용되었다면,4-Way handshake는 세션을 종료하기 위해 수행되는 절차입니다.
4-Way Handshaking
#1 : 클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송하고, FIN-WAIT 상태가 됩니다. #2 : 서버는 FIN 플래그를 받고, ACK를 보낸 후 자신의 통신이 끝날 때까지 기다리는 CLOSE_WAIT 상태가 됩니다. #3 : 연결을 종료할 준비가 되었다면, 서버는 클라이언트에게 준비가 되었음을 알리는 FIN 플래그를 전송합니다. 서버는 LAST-ACK 상태가 됩니다. #4 : 클라이언트가 FIN 플래그를 받으면, 해지 준비가 되었다는 ACK 플래그를 보냅니다. 클라이언트의 상태가 FIN-WAIT에서 TIME-WAIT으로 변경됩니다.
위의 과정과 같이 진행되는데, 만약 클라이언트가 종료되었는데, 서버에서 FIN을 전송하기 전에 전송 해놓은 패킷이 Routing 지연이나 패킷 유실 등의 문제로 인해 재전송 되어 FIN 보다 늦게 도착할 수 있습니다.
이러한 경우 클라이언트가 세션을 종료했다면 패킷이 Drop되고 데이터가 유실되어버립니다.
클라이언트는 이러한 현상에 대비하여 FIN을 수신하여도 일정 시간(기본 240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치게 되는데, 이 때의 상태가 TIME-WAIT 이라고 합니다. 일정 시간이 지나면, 세션이 만료되고 연결을 종료시키며 CLOSE 상태로 변하게 됩니다.