본문 바로가기

컴퓨터 네트워크

(컴퓨터 네트워크) 3. Socket Programming

해당 내용은 kocw 한양대학교 컴퓨터 네트워크 강의를 정리한 내용입니다.

강의 링크 - http://www.kocw.net/home/search/kemView.do?kemId=1169634&ar=relateCourse

 

이번 시간에는

1. socket이 무엇인지

2. socket programming의 함수 종류는 어떤 것이 있는지

3. 코딩 스타일에 대해서 알아보겠습니다.

 

1) Socket

결국에는 Application Program끼리의 통신이기 때문에, OS에서 제공하는 interface를 이용해서 통신을 하게 됩니다.

이때 OS에서 제공하는 interface가 Socket이 됩니다.

 

Application -> OS ----> 다른 OS -> 다른 Application 끼리의 통신이라서 network Layer를 지나칠 수밖에 없습니다.

앞에서 보았던 5 계층에 따라서 통신이 이루어집니다.

즉, Socket을 사용할 때, TCP / UDP인지 정해주어야 합니다.

 

그래서 Socket은 UDP socket과 TCP socket으로 나뉘게 됩니다.

 

  • TCP socket : SOCKET_STREAM
  • UDP socket : SOCKET_DGRAM

TCP socket interface에 write 하면 TCP방식으로 데이터가 전달되고

UDP socket interface에 write 하면 UDP방식으로 데이터가 전달됩니다.

 

2) Socket과 관련된 API

Socket Programming Big Picture

사진 출처 : https://www.cs.dartmouth.edu/~campbell/cs50/socketprogramming.html

 

전체적인 사진으로는 위와 같습니다.

 

먼저 서버와 관련된 API입니다.

  • socket() : TCP / UDP socket을 생성하는 API입니다.
  • bind() : 특정 port에 묶는 역할을 합니다.
  • listen() : 해당 socket을 listen(듣는) 용도로 사용하겠다는 함수입니다.
  • accept() : client로부터 요청받을 준비가 완료되었다 라고 알려주는 함수입니다. 그리고 server는 client에서 요청이 올 때까지 대기하고 있습니다.

Client와 관련된 API로는

  • socket() : 서버와 똑같이 TCP / UDP socket을 생성합니다.
  • connect() : 해당 server에 connect (연결)합니다.

그럼 이제 client와 server사이에 통신이 적용됩니다.

그래서 하나의 socket에 write 하면 다른 socket에 read로 통신이 이루어집니다.

 

마지막으로 연결이 끝나면 close로 통신을 종료합니다.

 


3) Multiplexing / Demultiplexing

Multiplexing : 여러 process의 여러 port에서 온 Data들을 Segment로 만들어서 다른 process에게 알맞게 보내주는 방식

Demultiplexing : 여러 process에서 온 Segment를 나의 알맞은 process들에게 넘기는 작업

 

Multiplexing, Demultiplexing은 Transport계층에서 일어나는 역할이고, TCP, UDP 모두 제공하는 기능입니다.

 

Multiplexing은 sender의 입장에서 일어나고

Demultiplexing은 receiver입장에서 일어납니다.

 

해당 작업은 TCP / UDP segment의 header를 보고 전달해 줍니다.

 

TCP와 UDP 헤더

사진 출처 : https://www.researchgate.net/figure/TCP-and-UDP-Headers_fig56_305506264

위 사진은 TCP와 UDP의 header인데, 둘 다 공통적으로 "Source port", "Destination port" 필드가 존재합니다.

해당 두 필드로 multiplexing, demultiplexing을 실시합니다.

 

3-1) UDP의 Demultiplexing

UDP의 Demultiplexing은 Destination port번호와 destination IP주소로 demultiplexing이 이루어집니다.

 

P3(port# : 9157)

P1(port# : 6428)

P4(port# : 5775)이 있을 때

 

P3 >>> P1으로 데이터를 보내면 (Source port : 9157, Destination port : 6428)

P4 >>> P1으로 데이터를 보내면 (Source port : 5775, Destination port : 6428) 이 되고,

 

두 데이터 모두 Destination port가 같고, 같은 IP인 P1에 보내는 것이기 때문에 P1의 같은 process에게 데이터가 전달됩니다.

 

3-2) TCP의 Demultiplexing

TCP의 Demultiplexing은 Source IP 주소, Source port번호, Destination IP 주소, Destination Port번호, 이 4 가지로 Demultiplexing이 이루어집니다.

 

UDP의 경우와 같이 P3 >>> P1, P4 >>> P1으로 데이터를 전송하게 되면

 

Destination IP, port#가 같지만, Source IP, port#가 달라서 P1의 다른 process에게 데이터가 전달됩니다.

 

그렇기 때문에, 무조건 하나의 process는 다른 하나의 process만 연결됩니다. -> "connect oriented"

실제로는 서버의 thread가 생성되어 각각 사용자들만을 위한 socket이 존재하게 됩니다. 

 

 

4) UDP Header

UDP 헤더

사진 출처 : https://www.researchgate.net/figure/TCP-and-UDP-Headers_fig56_305506264

UDP의 Header는 위 사진과 같이 Source port, Destination port, Segment length, Checksum 위 4가지 정보만 저장하고 있습니다.

 

  • Source port (16bit) : 수신자의 포트 번호를 저장하고 있다. (0 ~ 65535(2^16 - 1) 번까지 저장 가능하다.)
  • Destination port (16bit) : 송신자의 포트 번호를 저장하고 있다. (0 ~ 65535(2^16 - 1) 번까지 저장 가능하다.)
  • Segment lentgh : 데이터의 길이를 저장합니다.
  • Check sum : 데이터가 전송 중에 에러가 발생했는지 확인하는 필드입니다. (에러가 났으면 해당 packet을 버립니다.)

UDP의 기능 : Multiplexing, Demultiplexing, Error checking (Checksum)