본문 바로가기
자바/자바 NIO

TCP프로토콜과 소켓, 포트

by saul 2022. 6. 30.

소켓과 포트에 대해서 설명하기 전에 TCP 프로토콜에 대해서 먼저 설명하려고 한다.

 

먼저 TCP 프로토콜의 특징에 대해서 간략하게 말하겠다.

 

 

- TCP(Transmission Control Protocol) :

* 네트워크 4계층에 존재하는 프로토콜이다.

* 신뢰성이 있는 프로토콜 : 전송할 데이터가 안전하게 전달되는 것을 보장하는 프로토콜이다.

전달되는 데이터는 발신자가 보내는 것과 같은 순서로 수신자에게 전달된다.

 

따라서 TCP는 흔히 전화통화와 비교한다.

 

전화 통화 TCP
먼저 상대방의 전화번호를 입력 네트워크 내에 통신할 상대와 연결을 시도
(연결지향)
 
만약 상대방이 전화를 받는다면 대화를 한다.
 
이때 대화 내용은 내가 말한 순서대로
상대방에게 전달된다.
 
연결이 되어 양방향 데이터 교환이 이루어진다.
 
이때 데이터는 보낸 순서와 동일하게 상대편에 전달된다.
만약 상대방이 전화를 받지 않는다면
통화연결이 되지 않는다.
연결이 되지 않는다.
전화를 끊는다. 네트워크 연결을 종료한다.

 

이와 같이 TCP는 연결지향 프로토콜이다.

데이터를 전송하거나 수신하기 전에 '소켓'을 통해 양쪽 연결을 성립시킨다.

일단 위와 같은 식으로 연결이 성립되면 TCP는 데이터의 손실이나 중복 없이 데이터를 목적지에 확실하게 전달한다.

 

때 발신자는 데이터의 무결성을 보장하기 위해 체크섬을 포함해서 전달한다.

 

수신자는 발신자가 포함한 체크섬을 사용해서 전달받은 데이터를 확인한다.

만약, 이때 보낸 데이터의 일부가 유실되었거나 중간에 전달되지 않고 빠진 데이터가 있다면 수신자는 발신자에게 해당 데이터의 재전송을 요청한다.

 

또 다른 TCP의 특징으로는 소켓과 포트를 이용하여 동시에 여러개의 접속을 지원할 수 있다는 점이다.

하나의 채팅 서버가 동시에 수천 명의 동시 사용자들의 연결을 유지하는 것도 TCP가 지원하는 다중 송수신 특징 때문에 가능한 것이다.

 

TCP가 다중 송 수신을 어떻게 지원할까?

또한 트랜스포트 계층(4계층)을 지나 애플리케이션 계층으로 들어온 데이터를 프로그램에서 어떻게 인식해서 사용할까?

 

그것을 알기 위해서는 소켓과 포트에 대해서 알아야 한다.

 

 - 소켓과 포트

 

소켓(socket) :

프로세스가 네트워크를 통해서 데이터를 주고받으려면 반드시 열어야 하는 창구 같은 것이다.

보내는 쪽, 받는 쪽도 반드시 소켓을 열어야 데이터를 받을 수 있다.

 

또한 소켓에는 애플리케이션을 위한 한 쌍의 데이터 큐가 있다. 이는 전송을 위한 전송 큐와 수신을 위한 수신 큐가 있다.

 

직접 만들어 보았다... 참 못 만든다...

소켓은 보통 운영체제의 커널 안에 있는 메모리 영역으로 구현한다. 또한 특정 포트 하나와 연결해서 애플리케이션과 통신하게 된다. 

 

포트(port) : 

네트워크 상에서 통신하기 위해 서 호스트 내부적으로 프로세스사 할당받아야 하는 고유한 숫자이다.

한 호스트 내에서 네트워크 통신을 하고 있는 프로세스를 식별하기 위해 사용되는 값이므로, 같은 호스트 내에서 서로 다른  프로세스가 같은 포트 넘버를 가질 수 없다.

 

호스트(Host) :

네트워크에 연결된 모든 종류의 장치를 노드(Node)라고 부르는데, 노드 중에서도 네트워크 주소가 할당된 것들을 호스트라고 부른다. 스마트 폰이든 노트북이든 인터넷에 연결돼 있다면 호스트다.

 

 

즉 네트워크 공간 상에서 데이터를 주고받는다는 것은, 엄밀히 말하면 호스트의 프로세스까지 데이터가 오고 감을 의미한다.

 

보내는 쪽이 소켓이라는 창구를 열고, 소켓을 통해서 데이터를 보내면 네트워크 모델에 따라 목적지 호스트에 데이터가 도착하게 되고, 할당받은 포트 넘버와 같은 프로세스를 찾아 그 프로세스의 소켓을 통해 해당 프로세스에 데이터를 전달한다.

 

소켓을 열기 위해서는 호스트에 할당된 IP 주소, 포트넘버, 프로토콜이 필요하며, 이 세 가지가 소켓을 정의한다.

 

프로세스가 네트워크 통신을 하기 위해서는 포트를 할당받아야 한다.

포트 번호 하나당 프로세스는 여러 개의 소켓을 열 수 있다. (중요하다.)

 

즉 포트 번호는 밑에 여래 개의 소켓을 둘 수 있다는 것이다.

 

이런 이유에서 하나의 프로세스는 하나의 포트만으로도 다른 여러 호스트에 있는 프로새스의 요청을 처리할 수 있고, 게임 서버의 동시접속자 수가 수십수백만이 될 수 있는 것이다.

 

 만약 다수의 사람들이 네이버라는 웹 애플리케이션에 접속하려고 한다. 다수의 사람들이 접속을 하면서 한번에 한 번씩 애플리케이션을 사용할 수 있다면 상당히 불편할 것 같다.

 

소켓은 이를 해결해준다. 처리할 수 있는 곳을 한 곳이 아닌 여러 개를 지정해서 동시에 여러 사람이 애플리케이션을 사용할 수 있게끔 해준다.

 

 

 

 

 

참고 : 

김성박, 송지훈 『자바 I/O&NIO 네트워크 프로그래밍, P.32~35

[허언증/네트워크] Port(포트)와 소켓(Socket) 차이 :: 특기는 허언증 (tistory.com)

소켓(Socket) 포트(Port) 뜻과 차이 : 네이버 블로그 (naver.com)

'자바 > 자바 NIO' 카테고리의 다른 글

스레드 구현(추가)과 실행  (1) 2022.07.10
스레드의 구현, 멀티 스레드의 장점과 단점  (0) 2022.07.10
기초 네트워크  (2) 2022.06.29