웹앱이 되었건 어떤 어플리케이션이 되었건 결국 하나의 OS
이며 네트워크 기능이 있기 때문에 서버와 통신하며 데이터를 주고 받는다.
애플리케이션의 프로세스는 네트워크 기능이 있는 웹앱 프로세스
와 네트워크 기능이 있는 서버 프로세스
의 통신이다.
우리가 어떤 웹앱을 사용 할 때 우리는 웹앱
의 구조가 어떻게 되었는지 전혀 몰라도 웹앱
을 사용하는데 무리가 없다.
ICP
, 인터페이스
, API
가 뭔데 ?OS
간 IPC
하기 위해서는 인터페이스
가 필요하다.
IPC
: Inter process Communication 으로 프로세스 간에 데이터를 주고 받는 메커니즘을 이야기 한다. 예를 들어 모니터에서 컴퓨터가 보고 있는 내용을 디스플레이 하는 경우를 가정하자.
컴퓨터 본체와 모니터는 서로 다른 기기이기 때문에 이들간ICP
가 필요하다. 컴퓨터의 내용을 모니터에 보내버려야 하기 때문이다.
이 때 컴퓨터 본체의 내용을 모니터로 보내주는 어떤인터페이스
를 이용해 다른 기기인 컴퓨터와 모니터가 상호작용 한다.
컴퓨터와 모니터의 인터페이스는HDMI
선이 될 것이다.
즉 인터페이스는IPC
를 하기 위한 매개체이며ICP
는 인터페이스를 통해 진행된다.
또한 IPC
에는 정해진 규칙이 필요할 것이다. 이런 규칙과 메소드를 API
를 통해 정한다.
API
: Application Programming Interface 의 약자로 프로그램 간에 상호작용 하기 위한 규약이나 인터페이스를 말한다. 그니까ICP
를 가능하게 하는 규칙과 메소드의 집합
예를 들어서컴퓨터에서 모니터로 데이터를 전송
하는 기능과 규칙이 있을 것이고모니터의 해상도
를 설정하는 메소드도 있을 것이다.
결국 IPC
를 하기 위한 인터페이스
가 바로 API
이다.
웹앱
과 서버
또한 OS
이기 때문에 이들이 통신을 하기 위해선IPC
를 한단 것이고 IPC
를 하기 위한 매개체인 API
가 필요하다.
이러한 역할을 하는 것이 바로 소켓
이다.
이전 강의에서 말 했듯이 네트워크 레이어 최상단에 위치한 애플리케이션 레이어
는 하위 계층 레이어의 기능들을 이용한다고 하였다.
애플리케이션 레이어
의 하위 계층인 트랜스포트 레이어
의 기능을 이용해 서버
와 IPC
한다.
트랜스포트 레이어
는 TCP
와 UDP
를 사용한다.
내가 애플리케이션 레이어
에서 TCP
를 사용할거면 TCP 소켓
을 사용하면 되고 UDP
를 사용할거면 UDP 소켓
을 사용하면 된다 .
정리 :
소켓
의 종류는TCP 소켓
,UDP 소켓
이 존재한다.
TCP 소켓
은소켓 스트림
,UDP 소켓
은소켓 데이터그램
이라고 불린다.
지피티한테 오구오구 받으며 강의를 이해하고 있다 ..
서버
측에서는 우선 socket()
을 연다.
이후 열려있는 소켓
을 bind()
한다. HTTP
포트를 사용한다면 80
에 bind
할 것이다.
그리고 요청을 받을 준비를 하기 위해 listen()
을 실행하고
요청을 받을 준비가 되었다면 accept()
를 실행하여 클라이언트의 요청을 기다린다.
이후 클라이언트한테 요청을 받기 전까지 blocking
이 된다.
서버는 항상 수동적이다.
클라이언트
도 맨 처음 socket()
으로 소켓을 열어주고
connect()
를 이용해 서버
의 소켓
과 연결
한다.
이렇게 되면 현재 클라이언트
와 서버
는 단단하게 연결 되어 있다.
이 둘은 서로 단단하게 연결 되어 있기 때문에 온 세상에 다양한 클라이언트가 많지만 연결 된 소켓
을 찾을 수 있는 이유이다.
관계를 맺고 나면 서로 데이터를 보내고, 받고 하는 것이며 연결이 끝나면 close()
로 연결을 끊는다.
3가지 파라미터가 사용되는데 이 때 type
에 사용되는 파라미터가 중요하다.
type
에 들어가는 것은 TCP
를 사용할지 UDP
를 사용할지를 정해준다.
create
는 해당 매개변수들을 가지고 있는 소켓의 id
를 return
한다.
해당 id
를 가지고 만든 소켓
을 지칭한다.
우리가 방금 만든 소켓
을 특정 포트
에 bind
하겠다.
방금 만든 소켓
을 listen
하는 용도로 사용 할 것이며 만약 요청이 여러개 들어오면 최대 몇 개까지 들을 것이다를 지정한다.
우리는 연결 받을 준비를 끝냈으니 기다리겠다.
sockaddr
파라미터에 클라이언트의 주소
와 포트넘버
를 받은 후 연결을 기다린다.
서버측에서 소켓을 만들고, 포트에 바인드하고 , 들을 준비를 하고, 연결 받을 준비를 한다. 연결 받을 준비를 할 때 연결 될 클라이언트의
주소
와포트넘버
를 매개변수로 받는다.
클라이언트측에서도 통신하기 위해
소켓
을 만들고서버
와 연결한다. 이 때 연결 할 때에는서버 측 소켓
의주소
와포트넘버
를 매개변수로 받은 후 연결한다.
왜 클라이언트에는 바인드가 없나요 ?
바인드는 특정 포트와 바인드하는 개념인데 클라이언트는 특정 포트에 바인드 할 필요가 없다. 그냥 남아도는 포트에 바인드하면 된다. 뭐 1000번 포트에 쓰든 2000번 포트에 쓰든 상관 없다.
하지만 서버측은 어떤 포트를 사용할지 정해뒀기 때문에 포트에 바인드해줘야한다.
이후 C언어를 통한 이해가 있었으나 나는 C언어를 배워본적 없으니 흐름만 대충 슥슥 삭삭
교수님이 실제 프로젝트랑 서적이나 인터넷 뒤져보라고 한다 .. 강의 이후 추가공부를 꼭 하자 ..
예전에 파이썬
을 공부할 때 쥬피터 노트북을 이용한 적 있다.
이 때 웹 브라우저 형태에서 ipython
을 이용했었는데 이 때 뜨는 주소창인
localhost:8888
이 뭔 뜻인가 했더니 내 현재 IP : 포트넘버
였다.
오마이가아아아앗
컴퓨터 내부에 프로세스들이 많이 존재한다. 프로세스 별로 소켓이 여러개 있을 텐데 여러 소켓에서 내려오는 트랜스포트 레이어
에서 세그멘테이션
한 후에 더 하위 계층 레이어
로 내려서 전송 할 것이다.
이렇게 여러 개의 프로세스
와 여러 개의 소켓
에서 내려오는 다양한 데이터를을 한 번에 묶어서 세그멘테이션
시키는 것을 멀티플렉싱
이라고 한다.
멀티 플렉싱
: 여러 신호를 하나의 통로를 통해 전송하고, 다시 여러 신호로 분리하는 기술
다양한 프로세스 또는 소켓에서 내려오는 데이터를 한 번에 묶어서 전송하는 것은 일종의 멀티플렉싱이다.
sender
가 여러 개의 프로세스에서 멀티플렉싱
하여 하나의 세그멘테이션
으로 receiver
한테 하나의 세그멘테이션
을 보냈다고 해보자
그럼 receiver
는 또 한 덩어리의 세그멘테이션
을 적절한 프로세스
에게 쪼개서 보내야 할 것이다.
이렇게 한 덩어리의 신호를 여러 신호로 나눠 적절한 프로세스로 보내는 것이 디멀티플렉싱
데이터들이 packet
안에 data
와 header
가 존재함
손이 가리키고 있는 곳이 header
부분
segment
는data
와header
로 이뤄짐header
안에source port
,dest port
필드가 존재한다.
- 저 두 필드안의 내용을 가지고디멀티플렉싱
한다.
멀티플렉싱
포트별로 통신 하기 위해서 소켓
을 열고 포트넘버
를 적는다.
포트에 보낼 때 source port (자기 자신의 포트 넘버)
, dest port (목적지 포트 넘버)
를 header
에 작성한 채로 데이터를 보낸다.
정리 :
UDP 소켓
의 경우멀티플렉싱 , 디멀티플렉싱
은 어떻게 일어나냐면source port
,dest port
만을 사용해서 어떤소켓
으로 올릴지디멀티플렉싱
을 하게 된다.
디멀티플렉싱
포트에 보낼 때는 source IP
, source port
, dest IP
, dest port
를 이용해서 어떤 port
로 갈지 결정한다.
그 중에 하나라도 틀리면 다른 port
로 보낸다.
이것이 TCP
에서 말하는 Connection oriented
이다.
TCP
는sender
의주소
,reciever
의주소
까지 고려해서 신호를 보내기 때문에 다른 포트로 유실 없이 신호가 통하는 것이 가능하다.
UDP
는 포트 넘버
만 가지고 멀티 플렉싱 하기 때문에 어떤 데이터든 오면 받고 보내버림
TCP
는 포트 넘버
뿐이 아니라 포트 주소
까지 고려하여 데이터를 주고 받기 때문에 각각을 위한 고유의 포켓을 생성하고 연결
한다.
TCP connection
이란 클라이언트
만을 위한 소켓
을 생성하고 관리
- Connection oriented
는 유지할 수 있으나 클라이언트
마다의 소켓
ㅇ을 생성하고 관리하기 때문에 자원
이 많이 든다.
애플레케이션 레이어
에서는 header
에 어떤 정보가 있는지까지는 잘 몰라도 되지만 TCP , UDP
나 IP
에서는 header
에 어떤 정보가 있는지가 중요하다.
우편 배달부가 편지 봉투 안에 들은 내용 (
data
)을 보고 판단하나 ? 편지지 안에 들은 내용 (header
) 을 보고 행동하지 ~!!
UDP 세그먼트
는 4개의 필드
를 갖는다.
동작이 단순하겠구나 룰루랄라
필드 별 용량이 16비트
이기 때문에 포트 넘버
는 0번 ~ 2^16 - 1 번까지 존재한다.
한 컴퓨터 내의 포트 넘버는 이론상 6만 몇개가 가능하다.
UDP 는 포트 넘버를 가지고 뭘 하는데
멀티플렉싱
,디멀티플렉싱
을 한다.
checksum
: 전송 도중에 에러가 있었는지 없었는지 확인하는 영역drop
해준다.UDP
가 아무것도 안하고 데이터만 우다다 보내는 것만 같았지만 사실 두 가지 기능은 하는 것이다.멀티플렉싱
, 디멀티플렉싱
에러체킹
서로 다른 OS
는 IPC(inter process comunication)
를 통해 신호를 주고 받음
IPC
를 하기 위해서는 적절한 interpace
가 필요한데 그게 바로 API (Application Programming Interface)
클라이언트
와 서버
는 네트워크
기능을 가진 os
이기 때문에 이 둘이 통신을 한다는 것은 IPC
를 한다는 것
둘이 IPC
하기 위해있는 API
가 바로 소켓
소켓
은 두 가지 소켓
으로 구성 되어 있음
5.1 애플리케이션 레이어
는 하위 레이어인 트랜스포트 레이어
의 기능을 사용하는데 트랜스포트 레이어
는 TCP / UDP
를 사용함
5.2 그러니까 신호를 주고 받을 때 TCP
혹은 UDP
를 사용함
5.3 위에서 말한 두 가지 소켓
의 두 가지 종류는 TCP 소켓
, UDP 소켓
소켓
의 작동 방식
6.1 서버
측에서 소켓
을 생성함
6.2 생성한 소켓
을 포트
에 바인드
6.3 응답을 받을 준비를 하기 위해 리슨
6.4 응답 받을 준비가 완료 되었으며 어떤 클라이언트
한테 응답을 받을지를 설정하는 엑셉트
6.5 클라이언트
측에서 소켓
을 생성함
6.6 서버
와 커넥트
(TCP Connection
)
6.7 이후 신호를 wirte
, read
하며 통신
6.8 연결이 끝나면 두 곳 모두 소켓
을 close
멀티플렉싱
과 디멀티플렉싱
7.1 OS
에서 프로세스
는 엄청나게 많이 존재함
7.2 sender
의 다양한 프로세스
들의 다양한 신호를 receiver
한테 보낼 때 하나의 packet
으로 만들어 receiver
한테 전송 -> 멀티플렉싱
7.2.1 그 packet
안에는 header
와 data
영역이 존재함
7.3 packet
을 receiver
한테 보냄
7.4 recevier
는 한 덩어리의 packet
을 적절한 process
한테 보내야됨
7.5 적절한 process
에게 보낼 때 packet
의 header
에 적힌 내용을 통해 적절한 process
한테 데이터를 보냄
UDP 소켓
의 디멀티플렉싱
8.1 UDP
소켓은 packet
을 구성 할 때 header
에 source port (보내는 사람의 포트 넘버)
, dest port (받는 사람의 포트 넘버)
를 이용해서 process
에 디멀티플렉싱
TCP 소켓
의 디멀티플렉싱
9.1 TCP 소켓
은 source port , dest port
뿐이 아니라 source IP
, dest IP
까지 고려하여 디멀티플렉싱
한다.
9.2 그 말은 즉 한 명의 sender 의 IP
에 따라서 독립적인 TCP 소켓
을 생성하고 연결한다는 것이다. -> connection oriented
: 연결 보장하지만 자원 소모