본문 바로가기
CS/네트워크

WebSocket과 리눅스에서 소켓이란...?

by hyohyohyo 2023. 6. 7.
728x90

준비과정

사실 소켓 디스크립터(sd)라는 단어를 듣고, 오잉? 이게 뭐지 해서 찾아보다가 이렇게 정리하게 되었다 ㅎㅎ...

사실 디스크립터라는 단어를 자주 접해보기는 하였는데, OS에서 파일 디스크립터 이야기를 지겹게 들었던 것이 기억나 아 그럼 소켓 디스크립터는 무엇인가에 대해 공부를 해보았다.

이를 통해 OS가 소켓을 어떻게 관리하는지에 대해 더 깊게 공부하는 계기가 되었다.

 

소켓

일단 소켓에 대해 조금 공부해보자 ㅎㅎ

일단 네트워크를 이용하여 통신을 하는 각 프로세스간의 종착점이라 생각하면 된다.

그렇기에 소켓은 전송 계층과 응용 프로그램 사이의 인터페이스 역할을 하며 떨어져 있는 두 호스트를 연결해준다.

소켓은 프로토콜, IP, Port로 정의가 된다.

 

WebSocket은 뭐냐?

가끔씩 websocket이랑 socket을 동일하다 생각하는 사람을 본 적 있다.

사실 나도 처음에 소켓을 대충 개념만 알았을 때는 웹 소켓은 그냥 웹끼리 하는 소켓인가 이정도로만 생각을 했었는데, 역시 궁금해서 찾아 보았다.

일단 웹 소켓이라는 것은 서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 기술이다.

대표적 예시로 Real-time web application에 많이 사용되며 SNS 어플리케이션이나, 구글 Doc, 게임 등등...

WebSocket 사용 이유?

기존의 HTTP 통신으로만 하였을 때는 Stateless 구조여서 영구적인 연결이 아닌, Request가 올때만 서버가 Response를 할 수 있었다.

반대로 말하자면 서버가 클라이언트한테 언제든 Response를 날릴 수가 없다는 것이다.

이런 단방향 통신을 해결하고자 Ajax를 이용하는 등의 노력을 하였으나 여전히 속도의 이슈가 있었다.

하지만

WebSocket은 stateful하므로 한번 연결하고 그 라인을 계속해서 사용을 한다.

그렇기에 HTTP 연결할 때마다 들었던 TCP 연결 (3-way handshake)을 안 할 수가 있는 장점이 있다.

다만

이런 WebSocket도 처음 접속을 확립시키기 위해서는 HTTP를 이용해 이루어지고, 시간이 지나 HTTP는 끊기지만 WebSocket Protocol은 유지되어 통신을 하는 것이라 생각하면 된다.

 

대체법?

물론 WebSocket말고도 HTTP만으로도 이런 양방향 통신을 할려고 노력을 했었다.

Http Polling, Http Long Polling, Http Streaming 등등...

Http Polling은 말 그대로 주기적으로 서버에 요청을 보내는 것이다. (이벤트가 안왔는데도... 효율적이지 않고, 실시간성도 아닌...)

Http Long Polling은 요청이 들어오면 이벤트가 생길 때 까지 서버가 끊지 않고, 생기면 응답하고, 클라이언트는 다시 요청하는 형식... 물론 이벤트가 많아지면 Polling이 되는 ㅎㅎ...

Http Streaming은 말 그대로 서버가 연결을 끊지 않는 것이다. 즉 클라이언트는 계속해서 데이터를 수신한다는데, 이런 경우 클라이언트가 데이터를 보내기 어려워 진다 한다.

 

그래서 소켓과 웹 소켓의 차이점은?

사실 내용만 보면 이해가 잘 안간다. 나도 그랬었다.

거의 똑같은거 아닌가... 싶었는데 큰 차이가 있었다.

OSI 7계층에서 Socket의 위치는 어디인가? TCP, UDP 위에 계층일 것이다. 즉 4보단 높은데 응용 계층보다는 낮을 것이라고 생각 할 수 있다.

반대로 웹 소켓은? 

얘는 HTTP를 타고 가는 형태이기에 HTTP에 기반한다 생각할 수 있다.  그렇기에 7계층이다.

즉 계층에서도 차이가 난다.

그렇기에 PDU 단위 또한 소켓은 TCP를 통한 바이트 스트림이라고 생각한다면, 웹 소켓은 메시지(데이터) 단위일 것이다. 

사실 이 둘은 완벽하게 다르다고 보기도 애매하다 생각한다.

사실 웹에서도 TCP 소켓 즉 일반 소켓을 이용해서도 통신이 가능하다.

하지만 응용 계층에서의 통신을 통해 메시지를 보내는게 더 효율적이기에 이 웹소켓을 추가적으로 개발한 것이 아니겠는가?

즉 TCP 소켓과 다른 것이 아닌 TCP 소켓을 추상화한 것이라 생각 할 수 있다 한다.

 

사실 Socket.io 때문에...

저번 네이버 커넥트 재단의 네이버 부스트캠프에서 Socket.io를 이용한 실습을 해본 적이 있었다.

이때 이게 웹소켓 기술을 활용하는 라이브러리에요~ 라는 말을 들었다.

듣기로는 웹 소켓의 경우 HTML 5 이전에는 지원을 안하는데, Socket.io를 이용한다면 거기서도 호환이 된다고 한다.

뭐... 이 쪽에 대해서는 개발을 해보면서 더 추가적으로 찾아봐야겠다.

 

리눅스에서 파일 처리

일단 소켓과 웹소켓에 대해서 대충 알았으니, 이제 리눅스에서 소켓을 어떻게 다루나 보자.

일단 파일 디스크립터에 대해 알아볼 필요가 있는 듯 하다.

리눅스는 기본적으로 모든것들을 파일 단위로 처리하는데, 소켓, 디바이스, 등 모든 객체들을 파일로 관리한다.

그래서 프로세스는 이 파일들에 접근시, 파일 디스크립터를 이용해 접근한다

 

파일 디스크립터?

위에서 유닉스 계열의 모든 OS들은 모든것들을 다 파일로 관리한다고 하였다.

파일 디스크립터는 그냥 추상적인 값으로 특정 파일에 접근한다.

  • 기본적으로 보통 0이 아닌 정수 값이 들어간다
  • 프로세스가 파일을 open 시 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않은 가장 작은 값을 할당한다
  • 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.

그냥 간단하게 해시 테이블을 사용한다 할 때, 우리가 키값이 있어야만 접근할 수 있지 않은가

리눅스에서 파일을 접근할 때 똑같이 키값이 필요한데 그것이 FD라 생각하자

 

소켓 디스크립터?

그냥 파일 디스크립터를 이용해 소켓을 열면 그것을 소켓 디스크립터라고 한다.

그래서 개념상으로는 파일 디스크립터랑 동일하다.

물론 이 소켓 디스크립터는 소켓을 접근 가능하게 하는 매개체이므로 이것만으로 통신을 하는 것은 아니다 ㅎㅎ

 

 

참고 자료

https://duckdevelope.tistory.com/19

 

WebSocket 이란?

WebSocket이란 Transport protocol의 일종으로 쉽게 이야기하면 웹버전의 TCP 또는 Socket이라고 이해하면 된다.WebSocket은 서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신 또는 데이

duckdevelope.tistory.com

https://velog.io/@rhdmstj17/%EC%86%8C%EC%BC%93%EA%B3%BC-%EC%9B%B9%EC%86%8C%EC%BC%93-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%A0%95%EB%A6%AC-2#%EA%B7%BC%EB%8D%B0-http%EB%8A%94-%EC%99%9C-%EB%8B%A8%EB%B0%A9%ED%96%A5-%ED%86%B5%EC%8B%A0%EC%9D%BC%EA%B9%8C

 

[소켓과 웹소켓] 한 번에 정리 (2) | 소켓과 웹소켓의 차이점, 웹소켓의 모든것, http-tcp-소켓의 상

지난 시간은 소켓 위주로 정리를 해보았다. 이번 편은 웹소켓에 대해 다루어보자! 이번 기회에 소켓과 웹소켓의 차이를 확실히 알아두도록 하자....😌

velog.io

https://gusrb3164.github.io/web/2021/10/28/websocket-socket/

 

웹소켓과 소켓은 어떻게 다른가

OSI 계층 관점에서 보는 웹소켓과 소켓의 차이점, 브라우저에서 소켓 대신 웹소켓을 사용하는 이유

gusrb3164.github.io

 

 

'CS > 네트워크' 카테고리의 다른 글

OSI 7계층 PDU이름  (0) 2023.06.07
DNS 계층 구조  (0) 2023.06.06
Packet Delay(패킷 지연) 4가지 요인들  (1) 2023.06.05

댓글