본 글은, 윤성우의 TCP/IP 소켓 프로그래밍을 참고하였습니다.

순서
I. TCP/IP 소켓 프로그래밍이란?
II. TCP/UDP, 계층에 대한 이해
III. 소켓 프로그래밍 절차


I. TCP/IP 소켓 프로그래밍이란?

우리는 통신의 세계에 살고있다고 해도 과언이 아니다.

우리가 보고있는 웹 페이지부터, 볼 수 있고 인터넷 상에서 주고받는 모든 것들은 통신으로 이루어져 있는데,

IP와 Port번호를 소켓으로하는 네트워크 프로그래밍 중

IP 프로토콜을 기반으로 TCP 송수신 방식 사용하는 것을 TCP/IP 소켓 프로그래밍이라고 한다.

 


II. TCP/UDP, 계층에 대한 이해

다음은 TCP/IP 프로토콜 스택(계층)이다.

TCP/IP 프로토콜 스택


1. LINK 계층

LINK 계층은 물리적인 연결의 부분이다. 
LAN, WAN, MAX 등의 네트워크 표준과 관련된 프로토콜을 정의하는 영역이다.

두 호스트가 데이터를 주고받기위해 물리적으로 연결되는 부분이다.
(우리는 주로 LAN선을 사용한다)


2. IP 계층

192.168.101.222와 같은 IP는 데이터를 전송하기 위한 경로라고 볼 수 있다.

원하는 호스트에게 정확히 데이터를 보내려면 경로가 중요한데,
이 경로를 데이터 전송 시 마다 IP가 설정해준다.

중요!! : 하지만 IP프로토콜은 그 자체로 데이터의 신뢰성이 확보되지 않은,
오류발생에 대한 대비가 되어있지 않은 상태이다.

(+ Port란 뭘까?)
IP는 호스트의 주소를 나타낸다. 하지만 우리는 항상 IP와 Port를 같이 설정해준다.
이 과정에서 Port는 특정 "Application"과 연결을 시켜준다. (소켓)
예를들어 우리는 동시에 인터넷 창도 여러개, 메신저 등등 여러가지 프로그램을 동시에 켜놓는데,
각각의 프로세스가 가진 IP는 내 Host로 동일하지만 Port는 모두 다르다고 볼 수 있다.


3. TCP/UDP 계층

여기서 TCP/IP의 TCP가 설명된다.

우리는 위에서 IP가 신뢰성이 떨어지는 프로토콜이라고 말했었다.

따라서 우리는 IP의 프로토콜 위에 TCP/UDP의 "전송계층"을 추가해
이를 통해서 데이터를 전송하게 된다.

TCP : 데이터 패킷을 주고받을 때 항상 확인과정을 거친다(Flow Control) -> 신뢰성 확보
UDP :  확인과정이 없다. (Non Flow Control) -> 신뢰성 떨어짐, 그러나 빠르다.

그러면 UDP는 왜 쓰는가??

만개의 패킷 중 단 한개라도 손실되면 문제가 발생하는 경우는 TCP가 맞다.
하지만 스트리밍 서비스와 같이 속도가 중요하고
조금의 데이터 손실(잡음, 영상끊김)을 감안할 수 있다면 UDP가 빠르다.

중요!! : IP는 호스트로는 데려가 주지만 호스트의 각 PORT 소켓까지 전달하는 것은 TCP/UDP의 몫이다!


4. Application 계층

실제로 우리가 네트워크 프로그래밍을 구현해서 사용하는 계층.

구현은 이 부분에서 이루어진다. 나머지는 프로토콜 정의만 해주면 Low level에서 처리된다.
(우리가 실제로 구현하는 부분임!)

 


III. 소켓 프로그래밍 절차

서버와 클라이언트의 함수 호출 순서는 다음과 같다.

서버와 클라이언트의 함수 호출 순서

기본적인 흐름은 다음과 같다. (자세한 함수는 구현부에서)

1. socket() : 지정한 프로토콜과 전송방식을 갖는 소켓을 생성한다. (파일 디스크립터 반환)

2. *bind() : 지정한 프로토콜을 갖는 소켓에 주소(IP, Port)를 할당한다. (조금 어려움..)

3. listen() : 지정한 디스크립터 소켓을 서버소켓으로하여 연결요청을 '대기상태'에 둔다.
3-1. connect() : 클라이언트의 디스크립터 소켓을 전달해 연결요청을 한다.

4. accept() : 대기상태에 있는 클라이언트의 요청을 순서대로 수락한다. (비로소 데이터 주고받을 수 있음)

5. read(), write(), close() : 데이터 주고받고 끝낸다.


 

+ Recent posts