이 글은 이화여자대학교 이미정 교수님의 2014년 2학기 컴퓨터 네트워크 강의를 기반으로 재구성한 것입니다. 삽화는 링크를 출처로, 저작권은 J.F Kurose and K.W. Ross에게 있다는 것을 밝힙니다.
Application Layer에서는 크게 3가지를 살펴본다.
- application principle
- client-server 구조
- peer-to-peer (P2P) 구조
- transport layer service model
- internet protocol - HTTP, electronic mail(SMTP, POP3, IMAP), DNS, P2P
- network application의 작성을 위한 interface - socket, UDP, TCP
이 글에서는 socket interface를 살펴보며, TDP와 UDP에 따라 어떻게 작성하는지 살펴본다.
Socket Programming
지금까지 살펴본 application layer에서는 application protocol들(web은 HTTP, mail은 SMTP, ...)들을 살펴봤다. 이 application protocol들은 application program을 지원한다.
그렇다면 socket은 뭘까? socket은 application program와 OS transport layer의 interface이다.
socket은 2가지 방식으로 작동하는데, TCP와 UDP가 그것이다. socket으로 어떻게 TCP와 UDP를 사용하는지 볼 것이다. 이 글에서 유심히 살펴봐야 하는 것 중 하나는 [socket의 port가 뭘까?]인데, 딱 한 가지만 기억하고 있으면 된다.
- socket()으로 socket을 생성할 때 OS가 내부적으로 비어있는 port를 할당한다. 만약 다른 port를 쓰고 싶다면 bind()로 바꾸어야 한다.
Socket Programming with UDP
UDP는 통신을 위해 handshake가 필요없다. 때문에 sender는 어디로 보낼지에 대한 정보인 IP address와 port를 꼭 같이 작성해야 한다. 요청을 받는 server의 경우 client IP address, port를 모르는데, 이는 client의 첫 요청 segment에서 찾는다.
interaction 과정
server는 항상 실행중인 상태이다.
- server가 socket()으로 socket을 생성한다. 생성할 때 OS가 내부적으로 port를 할당한다.
- client가 socket()으로 socket을 생성하고, 이 때 server IP address와 port를 붙여넣고 send한다.
- 이 때 server IP address와 port는 알려져 있다.
- server는 응답을 보내야 한다. 이 때 client IP address와 port가 필요한데, 이는 2.에서 받은 segment에 있는 정보를 사용한다.
- client socket이 응답을 받는다.
- client가 close()를 호출해 socket을 닫는다.
- server socket은 유지된다.
python code
code로 표현하면 위와 같다.
- client의 경우
- socket() : socket을 생성한다. 이 때 IP version, protocol type(TCP or UDP)를 작성한다. socket()을 호출하면 OS가 내부적으로 빈 port를 알아서 할당해 준다.
- sendto(message()) : socket에게 message를 전송한다.
- recvfrom() : socket의 응답을 받는다.
- server의 경우
- socket()으로 빈 socket을 생성한 후, bind()를 사용해 명시적으로 port를 할당한다.
- client의 경우 port를 명시적으로 넣지 않는다. 그러나 server는 code에서 명시적으로 입력한다는 차이점이 있다.
- recvfrom()은 결과로 [message 내용, 보낸 곳]을 return한다. server는 recvfrom()의 리턴값으로 client IP address, port를 식별한다.
- sendto()를 사용해 client에게 message를 보낸다.
Socket Programming with TCP
UDP와는 다른 점이 몇 가지 있는데, 살펴보자.
- server는 socket()을 만들어 두고, 이 socket()은 contact를 받기만 한다. - 이 socket을 door socket이라고 한다.
- client socket()이 생성하면서 입력한 IP address, port를 사용해 server socket에 contact를 넣는다.
- server의 door socket은 contact가 오면, socket을 복사해 client 전용으로 만든다.
- UDP는 각 connection이 독립적이다. message를 하나 받으면 해당 message에 대한 response만 주면 끝이다. 반면 TCP의 경우 byte stream을 교환한다. 또한, TCP connection 도중에 다른 connection을 받을 수 있기 때문에 socket을 복사해 해당 client의 전용 통신 socket으로 만든다.
- TCP의 경우 handshake 과정에서 서로가 누군지 transport layer에서 식별하고 있기 때문에 message를 보낼 때 destination IP address와 port를 입력하지 않는다.
interaction 과정
server는 항상 실행중인 상태이다.
- server가 socket()으로 socket을 생성한다.(door socket) 생성할 때 OS가 내부적으로 port를 설정해 둔 상태이지만, server port는 알려진 값으로 설정해야 하기 때문에 bind()로 port를 변경한다.
- server socket을 대기 상태로 만든다. 만약 client가 해당 socket에 접속하면 accept()가 발생한다.
- client socket이 server socket에 connection message를 전송한다.
- server는 읽고, 응답한다.
- client도 읽고, 응답한다.
- server가 close한다. connection 시에는 door socket이 아니라 다른 socket을 사용했다. 닫을 때도 door socket이 아니라 통신에 사용한 socket을 close()한다.
python code
UDP와 동일하다. 다른 점만 짚어보면,
- client code의 connect()를 사용하면 해당 host, port를 사용해 내부적으로 handshake를 진행하고 TCP session을 생성한다.
- server code의 accept() : accept()는 client가 server로 contact를 했을 때 실행되며, 그 결과로 [새로운 socket, address]를 리턴한다. 이후 통신에는 새로 만들어진 socket을 사용한다.
- TCP session이 생성된 후에는 UDP와는 다르게 destination IP address, port를 적지 않아도 된다.
잘못된 내용이나 오탈자에 대한 지적, 질문 등은 언제나 환영합니다.
'CS > Network' 카테고리의 다른 글
[Network] 하향식 접근 네트워크 - 3. Transport Layer - (2) TCP (0) | 2023.07.29 |
---|---|
[Network] 하향식 접근 네트워크 - 3. Transport Layer - (1) Principles & UDP (0) | 2023.07.29 |
[Network] 하향식 접근 네트워크 - 2. Application Layer - (5) P2P (0) | 2023.07.27 |
[Network] 하향식 접근 네트워크 - 2. Application Layer - (4) DNS (0) | 2023.07.27 |
[Network] 하향식 접근 네트워크 - 2. Application Layer - (3) SMTP, POP3, IMAP (0) | 2023.07.27 |