What is a socker?
- OS에서 제공하는 API의 일종. 다양한 function들이 있다.
- 클라이언트 프로세스와 서버 프로세스 간의 통신을 할 때 우리는 사용자 혹은 개발자 입장이기 때문에 OS 내부는 모르고 OS에서 제공하는 어떤 서비스들만 사용할 뿐이다. 그런데 그 서비스를 사용하기 위해서는 OS가 제공하는 특수한 인터페이스를 사용해야 한다.
- 예를 들면 모니터 창에 뭔가 디스플레이 하고 싶다면 프로그램을 만들어서 ‘printf’라는 어떤 애플리케이션 인터페이스를 사용해서 메시지를 적어주면 이게 디스플레이 되는 것.
- 마찬가지로 네트워크 관점에서 다른 컴퓨터에 있는 프로세스에 우리가 어떤 정보를 보내고 싶으면 그에 맞는 어떤 인터페이스에 메시지를 적으면 보내진다. 즉, 일종의 OS가 제공해주는 API 중의 하나고, 프로세스들과 프로세스들 간의 통신을 위한 그 API를 소켓이라고 부른다.
→ 결국 OS가 제공해주는 기능을 사용하기 때문에 OS 내부에 구현돼 있는 것만 사용 가능한데 OS 안에는 애플케이션 레이어 그 밑에 있는 계층들이 구현되어 있다. 애플리케션 레이어 밑에는 트랜스포트 레이어가 있어서 트랜스포트 레이어에서 제공해주는 걸 사용할 수밖에 없다.
소켓 타입 두가지. TCP/UDP 소켓
- 현재 OS에서는 트랜스포트 레이어가 두 가지 프로토콜이 구현돼있다. TCP와 UDP. 그렇기 때문에 애플리케이션 프로세스는 어쩔 수 없이 소켓을 사용하되, TCP 소켓과 UDP 소켓 둘 중에 하나를 선택해야 한다.
- TCP 통신을 사용하고 싶다면 TCP 소켓을, UDP를 사용하고 싶다면 UDP와 연결된 소켓을 사용해서 뭔가 데이터를 보낸다. 즉, 소켓 사용할 때 소켓의 종류 자체가 다른 것.
- TCP 소켓은 소켓 스트림, UDP 소켓은 데이터그램이라는 이름으로 불린다.
TCP 클라이언트와 웹 서버 간의 통신
Socket Creation and Setup
- Include file <sys/socket.h>
- Create a socket. 웹 서버가 TCP 소켓을 연다(소켓 생성). 이 소켓이라는 것은 그냥 function.
- Bind a socket to a loca lIP address and port number. 방금 생성한 소켓을 특정 포트에 바인드한다. ex) 보통 웹서버 같은 경우에는 80번에서 돌아가니까 80번에 바인드 이런 식으로 포트 번호가 적힌다.
- Put socket into passive state(wait for connections rather than initiate a connection). 그 다음에 listen. 이 소켓을 listen 용도로 쓰겠다.
- Accept connections.
- 여기까지 수행이 되면 서버는 블럭킹이 된다. 클라이언트로부터 커넥션이 들어올 때까지 그냥 계속 가만히 있는 것. 서버는 수동적이다. 그러다가 어떤 사람의 웹 브라우저에서 동작을 취해서 소켓을 연다면 바로 커넥트.
쉽게 이해하자면
- 서버는 포트 80에서 리스닝 소켓을 열어 HTTP 연결 요청을 기다린다.
- 클라이언트 A가 서버에 연결을 시도한다.
- 서버는 리스닝 소켓을 통해 클라이언트 A의 연결 요청을 인식하고, 클라이언트 A와 통신하기 위한 새로운 통신 소켓을 생성한다.
- 동시에 다른 클라이언트 B가 연결을 시도하면, 서버는 리스닝 소켓을 통해 이 요청도 인식하고 클라이언트 B와 통신하기 위한 또 다른 통신 소켓을 생성한다.
- 서버는 항상 연결을 기다리기 위해 특정 포트에서 소켓을 열어두는데 이를 '리스닝 소켓'이라고도 한다. 클라이언트가 연결 요청을 보내면, 서버는 이 리스닝 소켓을 통해 요청을 받아들이고, 그 후에 클라이언트와의 통신을 위한 새로운 '통신 소켓'을 생성한다.
- *리스닝 소켓(listening socket)**은 전화기의 대기 모드와 같다. 전화가 올 수 있도록 대기하고 있는 상태. 이 상태에서는 데이터의 송수신은 이루어지지 않는다. listen 함수를 사용하여 소켓을 연결 요청을 수신할 수 있는 상태로 만든다.
- *통신 소켓(communication socket)**은 전화기로 통화를 하는 상태와 같다. 데이터의 송수신이 가능한 상태로 accept 함수를 호출하면 리스닝 소켓을 통해 들어온 연결 요청을 수락하고, 이 때 새로운 통신 소켓이 반환된다.
TCP socket connection setup
Server의 소켓 함수
Function: socket
- 제일 처음에 불려서 소켓을 만드는 function. 세 개의 파라미터가 있는데 진짜 중요한 건 두번째 파라미터. 이 소켓을 생성할 때 UDP 소켓인지, TCP 소켓인지를 결정하는 파라미터.
- 이 소켓의 return 값은 소켓의 ID 값. 이 ID로 소켓을 지칭
Function: bind
- 방금 생성한 그 소켓의 ID를 사용해서 이 소켓을 특정 어드레스에 바인딩하는 function.
Function: listen
- 방금 생성한 이 소켓을 listen 용도로 사용할 것이고 혹시라도 동시에 request가 여러 개 들어올 경우에 최대 몇 개까지 큐에 담아놓고 순서대로 처리할 것이다라는 function.
Function: accept
- 준비 동작이 끝났으니 이제 클라이언트로부터 연결을 기다리겠다는 function.
- 중요한 파라미터가 두 번째 파라미터. 이 accept라는 시스템 콜, function은 수행이 되면 블락하고 있다가 클라이언트로부터 커넥션 요청이 들어오면 수행이 되면서 리턴이 된다. 리턴이 될 때 두 번째 파라미터 주소 이 안에 클라이언트의 ip와 포트 넘버가 저장이 된다. 그래서 서버도 클라이언트의 IP 주소와 포트 넘버를 알게 된다.
Client의 소켓 함수
Function: connect
- 방금 만들었던 이 소켓을 내가 원하는 서버의 소켓과 커넥트를 하겠다는 function.
- 커넥트라는 함수의 파라미터로 이 서버의 주소와 포트 넘버가 들어간다.
클라이언트에는 왜 바인드라는 function을 쓰지 않을까? 바인드라는 건 결국에는 특정 소켓을 어떤 포트에 바인드 해주는 그런 개념인데 클라이언트는 특정 포트에 바인드 할 필요가 없다. 그냥 남아도는 거 아무거나 쓰면 된다. 웹서버는 80번에 써야할 이유가 있어서 굳이 80번이라고 지정해준 것이지만 클라이언트는 그럴 필요가 없다.
'컴퓨터네트워크' 카테고리의 다른 글
6. 트랜스포트 계층 2-2 (1) | 2023.10.31 |
---|---|
5. 트랜스포트 계층 2-1 (0) | 2023.10.27 |
4. 트랜스포트 계층 1 (0) | 2023.10.26 |
2. 컴퓨터네트워크 기본2 (0) | 2023.10.24 |
1. 컴퓨터네트워크 기본1 (1) | 2023.10.23 |