본문 바로가기
Computer Network/컴퓨터네트워크

[컴퓨터네트워크] 2. Application Layer (8)

by leziwn.cs 2023. 10. 8.
Socket programming with UDP and TCP
Socket programming

Socket programming

▶Two socket types for two transport services:

  • UDP: unreliable datagram
    --> 메시지를 하나의 UDP segment로 만들어서 delivery한다.
  • TCP: reliable, byte stream-oriented
    --> Application layer에서 내려보낸 메시지 boundary 인식 x --> TCP buffer에 메시지 받아서, TCP segment를 만든다.

 

Socket programming with UDP
Client/Server interaction: UDP

Client/Server interaction: UDP

  1. Server - client의 접속을 기다리고 있음
    : Create socket, port = x (프로그램 상에서 프로그래머가 명시적으로 포트 번호를 지정함)
    - serverSocket = socket(AF_INET, SOCK_DGRAM) -- UDP socket
  2. Client
    : Create socket
    - clientSocket = socket(AF_INET, SOCK_DGRAM) -- UDP socket
  3. Client
    : Create datagram with server IP and port = x; Send via clientSocket;
  4. Server
    : Read datagram from serverSocket; Write reply to serverSocket spefifying client address, port number;
  5. Client
    : Read datagram from clientSocket;
  6. Client
    : Close client Socket;

 

Example app: UDP client

Python UDP client

  1. Include Python's socket library.
    - serverName = 'hostname'
    - serverPort = 12000
  2. Create UDP socket for server.
    - clientSocket = socket(AF_INET, SOCK_DGRAM)
  3. Get user keyboard input.
    - message = raw_input('Input lowercase sentence:')
  4. Attatch server name, port to message; send into socket.
    - clientSocket.sendto(message.encode(), serverName, serverPort))
  5. Read reply characters form socket into string.
    - modifiedMessage, serverAddress = clientSocket.recvfrom(2048) -- server가 reply를 보낼 때, server의 주소를 포함한다.
  6. Print out received string and close socket.
    - print modifiedMessage.decode() clientSocket.close() -- clientSocket은 close, serverSocket은 close(x).

 

Example app: UDP server

Python UDP server

  1. Include Python's socket library.
    - serverPort = 12000 -- 프로그래머가 server socket을 지정한다.
  2. Create UDP socket.
    - serverSocket = socket(AF_INET, SOCK_DGRAM)
  3. Bind socket to local port number 12000.
    - serverSocket.bind((", serverPort))
  4. print("The server is ready to receive)
  5. Loop forever.
    - while Ture:
  6. Read from UDP socket into message, getting client's address (client IP and port).
    - message, clientAddress = serverSocket.recfrom(2048) -- client가 보내는 메시지에는 client의 주소가 포함된다. 
    - modifiedMessage = message.decode().upper()
  7. Send upper case string back to this client.
    - serverSocket.sendto(modifiedMessage.encode(), clientAddress)

 

Socket programming with TCP

▶ Client must contact server

  • Server: welcome socket

▶ Client contacts server by:

  1. Creating TCP socket, specifying IP address, port number of server process.
  2. When client create socket, client TCP establishes connection to server TCP. (welcome socket에 connect)
  3. When server is connected by client, server TCP create new socket for server process to communicate with that particular client.
    --> 일단 TCP connection이 생기면, 그 다음부터는 목적지 주소가 필요하지 않다. 
          cf) UDP: 매 segment가 독립적으로 취급되기 때문에, 항상 목적지 주소가 필요하다.
    --> server는 동시에 여러 client를 응대할 수 있다.

Application viewpoint

: TCP provides reliable, in-order byte-stream transfer.

 

Client/Server socket interaction: TCP

Client/Server socket interaction: TCP

  1. Server: running on hostname, wait for incoming connection request.
  2. Client: create socket, connect to hostname, port = x. -- Server의 주소로 접근한다.
  3. Server - welcome socket에서 받아들인다.
    - connectionSocket = serverSocket.accept()
  4. Clinet: send request using clientSocket.send()
  5. Server - 해당 client만을 전담하는 socket을 만든다.
    - read request from connectionSocket.recv()
    - write replay to connectionSocket.recv()
  6. Client: read reply from clientSocket.recv()
  7. Client: close clientSocket.close() -- 여러 번 전송 후, client socket을 close한다.
  8. Server: close connectionSocket.close()
    - connection socket: close (o)
    - welcome socket: close (x)

 

Example app: TCP client

Python TCP client

  1. Python socket library.
    - server의 servername, port 주소를 포함한다.
  2. Create TCP socket for server, remote port 12000.
    - clientSocket = socket(AF_INET, SOCK_STREAM) -- TCP socket
    - clientSocket.connect((serverName, serverPort))  -- 서버 정보를 포함한다.
  3. No need to attach server name, port.
    - clientSocket.send(sentence.encode()) -- 이제 서버 정보를 포함하지 않아도 된다.
  4. Client socket close.

 

Example app: TCP server

Python TCP server

  1. Python socket library.
    - serverPort = 12000 -- 서버의 prt 번호를 프로그램 상에서 명시한다.
  2. Create TCP welcoming socket.
    - serverSocket = socket(AF_INET, SOCK_STREAM) -- TCP socket
    - serverSocket.bind(('', serverPort) -- 서버 포트에 바인딩한다.
  3. Loop forever
  4. Server wiats on accept() for incoming requests, new socket created on return.
    - connectionSocekt, addr = serverSocket.accept() -- 특정 client의 address에 해당하는 serverSocket을 만든다.
  5. Read bytes from socket (but not address).
    - sentence = connectionSocket.recv(1024).decode() -- 전용 server에서 정보를 읽는다. 이때, 주소는 읽을 필요가 없다.
  6. Close connection to this client (but not welcoming socket).

 


Socket programming with UDP vs. TCP
1) client 비교

UDP vs. TCP

  1. Python socket library.
  2. Create UDP/TCP socket for server.
    - UDP: SOCK_DGRAM
    - TCP: SOCK_STREAM
    + TCP에서는 client socket이 serverName, serverPort를 특정한다. (특정 client를 전담하는 server socket)
  3. Get user keyboard input.
  4. Server name, port number attatch vs. non-attatch.
    - UDP: Attatch server name, port number.
    - TCP: No need to attatch server name, port number.
  5. Print out received string; Close client socket.

 

2) server 비교

  1. Python socket library.
  2. Create UDP/TCP socket.
    - UDP: SOCK_DGRAM
    - TCP: SOCK_STREAM -- welcoming socket
  3. Bind socket to local port number 12000.
  4. Request x vs. o
    - UDP: request (x)
    - TCP: server begins with listening for incoming TCP request.
  5. Loop forever.
  6. Accept x vs. o
    - UDP: acception (x)
    - TCP: server waits for accept for incoming request, new socket created in return. -- 특정 client에 대한 전담 socket
  7. Read message vs. byte stream, Message includes address vs. no-address
    - UDP: read from UDP socket into message, getting client's address.
    - TCP: read bytes from TCP socket, but not address in UDP
  8. Socket no-close vs. close.
    - UDP: close (x)
    - TCP: close (o) but not welcoming socket.

 


Chapter 2: summary

▶ Application architectures

  • client-server
  • P2P

 

▶ Application server requirements (transport 계층에게의 요구)

: reliability, bandwidth, delay, security

  • reliability: TCP
  • bandwidth, delay, security: 지원(x)

 

▶ Internet transport service model

  • TCP: connection-oriented, reliable
  • UDP: unreliable, datagrams

 

▶ Specific protocols:

  • HTTP, HTTP/2, HTTP/3
  • SMTP, POP, OMAP
  • DNS

 

▶ Performance comparison: client-server vs. P2P

 

▶ Video streaming, CDNs, DASH

 

▶ Socket programming: TCP, UDP sockets