소켓( Windows Sockets, Winsock )은 윈도우 운영체제에서 네트워크 통신을 할 수 있도록 해주는 API다.
  • 소켓( Socket )은 OS 커널에 구현되어 있는 프로토콜 요소에 대한 추상화된 인터페이스를 말한다.
  • 장치 파일의 일종으로 이해할 수 있다.
  • 일반 파일에 대한 개념이 대부분 적용된다.

추상화된 인터페이스라는 점은 fopen을 통해 좀 더 깊게 이해 할 수 있다.

예를 들어 fopen_s(&fp, "CON", "w");를 호출하면 장치 파일인 콘솔 즉, 화면으로 모든 출력이 나가는 것을 확인할 수 있다.

만약 CON이 TCP일 경우에는 네트워크로 데이터가 나가는 것이라고 생각할 수 있다.

 

이처럼 소켓은 본질이 파일이다.

 

파일에 대한 입출력이 발생할 때, 그 액세스의 주체는 프로세스다. 즉, 프로세스는 파일을 열고, 생성하며, 닫거나 삭제 할 수 있다.

 

그런데 만약 이 파일이 TCP 스택에 대한 추상화된 인터페이스를 제공하는 경우, 이 파일은 일반적인 파일이라 하지 않고 TCP 소켓이라고 부른다.

 

다시 말해 소켓프로그래밍의 또 다른 이름은 TCP라는 대상을 추상화 시킨 파일에 대한 입출력 방법론을 배우는 것이라고 할 수 있다. 파일에 쓰는 작업인 write에 대응하는 소켓 함수는 send, 파일을 읽는 작업인 read에 대응하는 소켓 함수는 receive, 파일을 닫는 함수 fclose에 대응하는 소켓 함수는 closesocket이다.

 

파일이 나오면 항상 엮어서 생각해야 될 단위는 스트림이다. 우리가 파일에 데이터를 쓸 때 연속해서 데이터가 붙듯이 소켓도 마찬가지다. 그래서 유저 모드 어플리케이션 수준(=L7)에서 소켓이 나오면 스트림이라는 말이 나와야하고, 이 스트림이 커널 모드로 내려가서 L4로 가면 데이터의 단위가 segment, L3로 가면 데이터의 단위가 packet으로 바뀌어 불린다.

 

직소 퍼즐처럼 세그먼트랑 패킷은 분리되어 조각 하나하나가 연속적으로 쭉 이어져 있다.

다시 말해 스트림은 기본적으로 패킷이 조립 되어 연속된 데이터들로 생각하면 되고 세그먼트와 패킷은 조각된 단편 하나다.

+ Recent posts