Socket programming
socket : application layer 와 transport 레이어의 통과문 같은 역할
- 각 end-system마다 부착
- application layer는 개발자가, 나머지는 OS가 통제
목표 : socket을 이용한 클라이언트/서버 통신 application을 위해
application 프로그램 동작 방식
- 클라이언트가 키보드로부터 한 줄의 코드를 읽어서 서버에게 전송
- 서버는 그것을 모두 대문자로 바꾸고 수정하여 클라이언로 전송
- 클라이언트가 수정된 정보를 화면에 띄움
Socket types for two transport services
UDP와 TCP 모두 client socket을 만들때는
port 번호를 프로그램 상에서
지정하지 않는다.
OS가 해준다.
UDP와 TCP 모두 server socket에
프로그램 상에서 프로그래머가 정한 port number로 bind 시켜주어야 한다.
즉, 서버 socket의 경우는 port 번호가 무엇인지 프로그래머가 알아야 한다.
- server socket의 경우 port 번호를 명시적으로 알고 있어야 client가 이를 사용하도록 할 수 있기 때문임
application service requirement에서
reliability, bandwidth, delay 중,
requirement는 TCP가 지원해주지만
나머지 두 개는 UDP도 못 해줌
UDP : unreliable datagram
- UDP 서버는 클라이언트가 보낸 데이터로부터 클라이언트의 주소를 획득하여 그 주소로 답을 보내준다.
- 클라이언트/서버 간 connection을 맺지 않음
- handshaking X
- 대신 보내는 쪽은 매 packete마다 IP와 포트번호를 명시해야함 (끝점도 같이 명시)
- 받는 쪽은 매 packet로부터 IP와 포트번호를 추출해야함
- 전송한 데이터를 잃어버리거나 오래된 정보가 될 수 있음 (loss 재요청 불가능)
- 그러므로 unreliable transfer.
TCP : reliable, byte stream-oriented
- connection setup 시에, 상대 end point인 server의 name과 port번호가 데이터를 내보내는 connection에 연결되어 있기 때문에 데이터 내보낼때 명시할 필요가 없다.
- server TCP socket
- UDP처럼 server는 항상 켜져있음. 다만, welcome socket을 또 만들어서 클라이언트의 contact를 기다림
- 클라이언트가 contact을 요청하며 TCP 서버는 “새 socket”을 생성하여 특정 client와 해당 socket으로 통신함
- 즉, client 별로 end to end 연결을 맺음. 그래서 welcome socket은 항상 존재해야함
- TCP는 source의 포트번호를 확인해보고 어느 socket과 연결해줘야하는지 앎
- client TCP socket
- clinet에서 TCP socket을 생성할 때 server IP 주소와 포트번호를 명시함
- 서버소켓은 상대방의 IP주소, 포트번호를 생성 시 명시 안함
- 생성하는 순간 서버 TCP와 클라이언트 TCP가 연결 성립
- clinet에서 TCP socket을 생성할 때 server IP 주소와 포트번호를 명시함
- 그렇기에 TCP는 reliable
- byte-stream transfer == pipe
- application이 내려주는 메시지를,
- TCP는 byte-stream 방식으로 전달
- 즉, 각각의 메시지를 경계지어 인식하지 않고 byte의 흐름으로 보면서 쭉 보냄
- 보낸 순서를 지킬 수 있게 됨
Client/Server Socket interaction
UDP
server ( 서버 IP host에서 실행되고 있어야함)
- 1. 서버가 포트번호를 지정한 뒤 serverSocket을 생성 serverSocket = socket(AF_INET, SOCK_DGRAM)
- AF_INET : 주소 체계가 IPv4임을 표시
- SOCK_DGRAM : UDP socket임을 표시
- 4. serverSocket으로 부터 client로부터 받은 datagram을 읽음
- 5. 그에 대한 응답을 serverSocket에 적어서 클라이언트에게 보냄
- UDP라서 client address와, port 번호도 같이 명시함
client
- 1. client 측에서도 socket 생성 clientSocket = socket(AF_INET, SOCK_DGRAM)
- 2. 이후에 서버IP(이름)와 포트번호(목적지)로 datagram 생성하여
- client의 port 번호는 명시적으로 사용할 일이 없음
- socket 생성 시 OS에 의해 자동으로 할당됨 (서버는 개발자가 포트번호를 지정)
- 3. clientSocket를 이용하여 그곳으로 데이터 전송
- 6. client Socket으로부터 datagram(받은 응답도 함께)을 읽음
- 7. close clientSocket
!! server는 close X
(while True): 계속 열어둬야 다른 client 요청을 받을 수 있다
UDP 서버는
하나의 socket을 통해 접속하는 모든 client를 응대하는 반면,
TCP 서버의 경우는 각 client 별로 별도의 connection socket을 생성해 데이터를 주고 받는다.
UDP의 경우는 client별 socket을 만든 것이 아니므로
한 client와의 통신이 끝나도
추후 다른 client를 응대하기 위해 socket을 계속 열어두고 있어야 함
TCP
server (running on hostid)
- 1. serverSocket = socket() 생성
- 들어오는 요청을 포트 번호를 지정하여 받음.
- 이것은 welcome socket
- 2. connection 요청이 들어오면, connectionSocket = serverSocket.accept() 생성
- 3. TCP Connection Setup
- 5. connectionSocket으로부터 요청을 읽음
- 6. connectionSocket에게 응답
- 8. close connectionSocket
- U
client
- 1 .hostid(serverName)와 같은 포트번호로 연결하기 위한 clientSocket = socket() 생성
- 3. TCP Connection Setup
- UDP와의 차이점
- clientSocket.connect((serverName, serverPort))
- 4. clientSocket을 통해 요청을 보냄
- UDP와의 차이점
- 포트번호와 서버 이름을 또다시 명시할 필요 X
- 7. clientSocket으로부터 응답을 읽음
- 8. close clientSocket
TCP의 경우는
client 별로 그 client와의 통신을 위해 만들어진
connection socket을 close하지만,
UDP의 경우는
client별 socket을 만든 것이 아니므로
한 client와의 통신이 끝나도
추후 다른 client를 응대하기 위해
socket을 계속 열어두고 있어야 하고,
TCP의 경우도
임의의 client가 접촉했을 때
이를 받기 위한 welcome socket은
계속 열어두고 있어야 함.
TCP 서버가 n개의 연결을 동시에 유지한다면, 소켓이 얼마나 필요한가? UDP의 경우는?
TCP
- 동시 연결을 지원하기 위해, 각 client마다 소켓(connection socket)이 필요하고,
- TCP 서버에 client-server 연결을 잡을 때 쓰는 소켓 (welcome socket)이 하나 필요하기에,
- n+1 개
UDP
- welcome socket이 없고,
- 다른 클라이언트의 모든 데이터는 하나의 소켓으로 들어감
- 일반적으로 UDPClient에서 소켓 생성 시 port 번호를 명시하지 않는다. 이 경우는 OS가 포트번호를 선택하도록 역임하는 것.
- 그런데 clientSocket.bind( ( ‘ ’, 5432 ) ) 코드를 추가하면 UDPClient가 실행됐을 때, UDP socket은 포트 5432번으로 생성된다
- UDP server는 client 포트 번호를 알아야 하므로 대상자가 옳은 client socket에게 다시 패킷들을 보낸다.
- UDP server에는 client port number가 server code에 단단히 엮어있지 않는다. 대신에 UDP server는 client로부터 받은 datagram을 풀어서 client 포트번호를 결정한다
- 그러므로, UDP 서버는 OS 지정 포트번호가 아니어도, 모든 client 포트번호와 일할 수 있다!!
- 따라서 clientSocket.bind( ( ‘ ’, 5432 ) )를 추가하더라도 UDP 서버는 수정하지 않아도 된다.
Before:
Client socket = x (chosen by OS)
Server socket = 9876
After:
Client socket = 5432
'CS > Network' 카테고리의 다른 글
Transport Layer - MUX, DeMUX (0) | 2021.10.16 |
---|---|
[Summary] Application Layer (0) | 2021.10.16 |
Video Streaming and CDNs (Content Distribution Networks) (0) | 2021.10.16 |
P2P (0) | 2021.10.15 |
DNS (0) | 2021.10.15 |