소켓은 OS 커널에 구현되어있는 프로토콜 요소에 대한 추상화된 인터페이스이며, 장치 파일의 일종이다.
본질은 File 이라는 점이다.
보통 파일에 대한 I/O가 진행될 때, process가 주체가 되고, 파일이 대상체가 된다.
파일에 대해서 주체는 open, create, close, read, write, excute, delete 와 같은 작업을 하는데, 만약 대상체파일이 TCP 스택에 대한 추상화 인터페이스를 제공한다면 그것이 TCP socket이라한다.
여기서 segment 와 packet 이라는 개념이 나오는데, 쉽게 이야기하면 segment는 L4계층에서 사용하는 단위고, packet은 L3에서 사용하는 단위다.
그래서 segment를 담아서 만든 택배박스 같은 개념이 packet이라 생각하면 된다.
기본적으로 클라이언트와 서버간에 양방향 통신을 하기 위해서 사용된다. http통신은 서버가 client에게 요청을 보낼 수는 없다.
하지만 socket 통신은 실시간으로 양방향 통신을 할 수 있다.
소켓의 종류는 크게 3가지 유형이 있다.
해당 내용은 "널널한개발자" 유튜브 수업을 통해 정리했다.
위에 그림을 보면서 설명을 진행해보겠다.
우선 위에 그림은 서버 사이드에서 그린 그림이다.
우리는 서버에서 어떠한 데이터를 클라이언트로 보낼 때, 어쨌든 메모리에서 해당 정보를 가져와야한다. 그리고 memory의 버퍼에서 TCP 버퍼로 데이터를 복사한다. 그리고 TCP 버퍼에 복사된 데이터의 단위는 segment라 부르고, TCP에서 IP로 넘어가면, packet으로 단위가 표현된다.
여기서 서버가 클라이언트로 데이터를 보낼때, 보내고 싶은 데이터를 한 번에 보낼 수 없다. 그래서 TCP의 버퍼 크기만큼 원래의 데이터를 세그먼트 단위로 조개어 TCP 버퍼에 저장한다.
예시)
만약 퍼즐 조각의 한개를 1개의 세그먼트로 표현해본다고 하자,
그리고 보내야될 데이터는 100개의 세그먼트로 나타낼 수 있다고 해보자.
그리고 TCP 버퍼에는 4조각의 세그먼트만 저장될 용량이라고 하자.
그러면 TCP에 버퍼 4조각을 1,2,3,4로 표현한다면, 1번 부터 차례로 IP로 보내면서 packet을 만든다. packet 한 개에는 한 개의 세그먼트가 들어있다.
그리고 해당 packet은 Frame 으로 감싸여 client로 차례대로 보내진다.
(서버에서 clinet 로 보내는 부분을 먼저 설명, client에서 받는거는 추후에 설명)
여기서 잘 기억해야하는 부분은, TCP 버퍼의 존재와, 각 계층별 단위에 대한 개념 그리고 소켓이 파일이라는 점을 잘 기억해야한다.
그렇다면 packet을 받은 client는 어떠한 처리르 하게 될까?
클라이언트는 packet을 받으면 열어서 세그먼트를 client의 TCP 버퍼에 저장한다. 여기의 TCP 버퍼도 저장될 수 있는 공간이 정해져있다. 그리고 순서대로 세그먼트가 오면 일정 분량의 세그먼트가 왔을때, 클라이언트는 서버에게 ack를 보낸다. 그런데 ack를 보낼 때, window 사이즈 정보를 같이 보내주는데, 이 정보는 TCP 버퍼에서 사용 가능한 공간 사이즈를 보내주는 것이다.
만약 2번 세그먼트까지 받고 3번 세그먼트를 받으려는데, TCP 버퍼에 3번을 담을 공간이 없다면, 서버는 데이터를 보낼 수 없다. 그럴때, 서버는 사용할 공간만큼 메모리가 확보될 때까지 WAIT 을 한다. 즉, 속도지연이 생긴다는 이야기이다.
클라이언트에서는 TCP버퍼로 데이터를 받으면 File I/O가 가능하도록 해당 데이터를 복사하고, TCP 버퍼에서는 지워줘야 하는데,
서버에서 보내는 속도보다 TCP 버퍼에서 File I/O 쪽으로 데이터가 복사되는게 더 느려져서 공간 확보가 더디게 되어 계속 공간이 차게되면서 서버에서 보낸 데이터를 빨리 읽기 힘들어진다.
TCP/IP를 송수신하는데에 있어서 이러한 부분을 이해하고 넘어가면 개발을 할때 도움이 더 많이 될 것이다!!