본문 바로가기
Research/Computer Science

ISO, TCP-UDP, TCP 3way handshake

by RIEM 2023. 3. 31.

ISO model

Screenshot 2023-03-20 at 10 32 05 PM

TCP와 UDP를 이야기하기 전 ISO 모델을 먼저 보겠습니다. OSI 모델은 컴퓨터들 사이 통신 상황을 7개의 계층으로 구분한 일종의 개념 모델(conceptual model)입니다. 통신하는 컴퓨터들 간 데이터의 흐름을 파악하는데 도움을 주는 모델입니다. OSI는 Open Systems Interconnection model의 약자입니다.

ISO 모델은 총 7개 계층으로 구성되어 있습니다. Physical, Data link, Network, Transport, Session, Presentaion, application. 이중 4번째 계층인 Traport layer에서 TCP, UDP 통신이 이뤄집니다.

OSI Model

  • Media layers
      1. Physical(bit, symbol) : transmission and reception of raw bits streaming
      1. Data link(Frame) : transmission of data frames btw two nodes connected by a physical layer
      1. Network(Packet) : structuring and managing a multi-node network, including addressing, routing and traffic control
  • Host layers
      1. Transport(Segment, Datagram) : reliable transmission of data segments btw points on a network, including segmentation, acknowledgement and multiplexing
      1. Session(Data) : managing communication sessions, i.e., continuous exchange of information in the form of multiple back-and-forth transmissions btw two nodes
      1. Presentation(Data) : Translation of data btw a networking service and an application; like character encoding, data compression, encryption/decryption
      1. Application(Data) : High-level protocols such as for resource sharing or remote file access, e.g. HTTP

bit, frame, packet, data 등 계층마다 PDU(Protocol data unit)이 각기 다른 것을 알 수 있습니다. Physical 계층에서 bits 단위의 데이터를 다루며 위로 올라갈 수록 점점 추상도는 높아집니다. 반대로 보면 상위 레이어의 기능은 하위 레이어가 구현해주는 계층적 구조로 되어있습니다.

사실 네트워크 모델은 여러가지이고 OSI는 그중 하나입니다. OSI가 자주 언급되는 이유는 OSI 만큼 네트워크 세상을 설명하기 좋은 모델이기 때문입니다.

OSI / layer 4

OSI model에서 TCP, UDP 프로토콜을 사용하는 4번째 계층 Transport Layer를 봅시다.

Transport layer은 다양한 길이의 시퀀스 데이터를 전송하는 계층입니다. 전송 프로토콜(규약)은 연결 지향적(UDP)이거나 비연결적(UDP)입니다.

이 단계에서는 큰 데이터나 긴 데이터 스트림을 'segment'라는 작은 덩어리로 쪼갭니다. 왜냐하면 보낼 수 있는 최대 패킷 사이즈(MTU, maximum transmission unit)이 한정되어있기 때문입니다. 사이즈는 3계층(network-layer)이나 4계층(tranport)의 헤더에 넣을 수 있을만큼만 작으면 됩니다.

OSI / layer 4 /TCP, UDP

컴퓨터끼리 통신하는 방식은 여러가지 있는데, 그중 TCP와 UDP는 OSI 7 모델에서 4번째 Transport Layer에 속합니다.

TCP는 연결 지향(Connection-oriented)적인 프로토콜입니다. 덕분에 데이터 패킷을 손실 없이 주고 받을 수 있어 데이터의 무결성(integrity)을 제공합니다. 게다가 주고 받는 순서까지 보장해줍니다. 이러한 장점 때문에 데이터의 온전함이 중요한 어플리케이션, 이메일, 브라우저, 파일 전송 등에서 주로 사용합니다. TCP는 Transmission Control Protocol의 약자입니다.

이와 반대로 UDP는 비연결형(Connectionless) 프로토콜입니다. TCP가 쌍방향 소통이라면 UDP는 한쪽의 일방적인 소통입니다. 듣는 사람은 신경쓰지 않고 일단 던진다고 해서 Fire and forget protocol이라고도 합니다. UDP의 장점은 1)속도와 2)무상태성입니다. 상대방에게 잘 전달되었을까라는 확인하는 작업으로 인한 overhead가 덜 생깁니다. 따라서 대역폭(bandwidth) 좁고 패킷이 더 작아서 TCP보다 빠릅니다. 물론 상대방에 대해 신경을 쓰지않아도 되기에 stateless합니다. 반면 세션이 만들어지지 않기에 전송이 제대로 되었는지 보장하기는 어렵습니다. 패킷의 순서도 보장할 수 없습니다. 따라서 일반적으로 UDP는 전송 속도가 중요한 비디오 스트리밍, 온라인 게임 등에서 주로 사용합니다. UDP는 User Datagram Protocol의 약자입니다.

TCP(Transmission Control Protocol)

  • 연결 지향성(Connection oriented protocol) 프로토콜
  • 장점
    • 데이터 무결성(integrity) 보장
    • 데이터의 순서 보장
  • 사용
    • 웹 브라우저, 이메일, 파일 전송, 데이터 무결성이나 신뢰성이 중요한 어플리케이션

UDP(User Datagram Protocol)

  • Connectionless Oriented Protocol
  • 데이터가 상대방에게 잘 전달되었는지 상관하지 않는다. 데이터가 잘 도착되었는지 확인하기 위한 작업이 없기 때문에 overhead가 덜 발생되어서 속도가 상대적으로 빠르다.
  • 장점
    • 패킷, 대역폭(bandwidth) 적어 tcp보다 빠르다
    • stateless하다
  • 단점
    • 응답이 없어 전송 보장 불가
    • 패킷의 순서가 없다
    • 정체를 통제할 수 없다
    • 보안성이 낮다
  • 사용
    • 비디오 스트리밍, 온라인 게임 등 응답 속도와 시간이 중요한 실시간 어플리케이션

TCP의 3-way handshake

TCP의 작동 원리에 대해 좀 더 알아보겠습니다.

TCP는 연결지향적 특징을 가진 신뢰성을 중시하는 프로토콜입니다. 이러한 소통방식을 Positive Acknowledgement with Re-transmission(PAR)이라 합니다. Transport 계층의 PDU(Protocol Data Unit)은 segment입니다. 기기가 PAR 방식으로 데이터를 보냅니다. 받은 쪽에서 문제 없을 경우 acknowledgement하고, 만약 데이터에 손실이 있는 경우 무시합니다. 보낸 쪽은 응답이 없음을 알아차리고 다시 재전송합니다. 이러한 과정을 메시지 유형을 기준으로 봅시다.

TCP 메시지 유형

TCP 메시지는 크게 4가지로 분류합니다. Syn, ACK, SYN-ACK, FIN.

Syn은 연결을 생성하거나, 두 기기 간 시퀀스 넘버들을 동기화할 때 사용합니다. ACK는 건너편에서 SYN을 잘 받았다고 응답을 하는 신호입니다. SYN-ACK는 로컬 기기로부터의 SYN 메시지와 이전 패킷의 ACK를 함께 보내는 것입니다. FIN은 연결을 끝내기 위한 메시지입니다.

TCP 메시지 유형

  • Syn
  • ACK
  • SYN-ACK
  • FIN

3way handshake

  1. SYN : 클라이언트가 서버에게 SYN(Synchronize Sequence Number) segment를 보냅니다. 즉, 클라이언트는 서버와 소통하고 싶은데, 만약 소통을 하면 특정 sequence number로 소통하자라는 의사를 전달합니다
  2. SYN + ACK : 서버는 흔쾌히 수락하는 의미에서 SYN-ACK 시그널 비트로 응답합니다. 이때 ACK(Acknowledge)는 클라이언트의 요청을 잘 받았다는 것이고 SYN은 소통할 sequence number를 서버 측이 다시 제안하는 것입니다
  3. ACK : 서버로부터 응답을 받은 클라이언트는 ACK을 통해 최종적으로 응답을 보냅니다. 서로 ACK를 주고 받았으니 이제부터 실제 데이터를 전송할 수 있는 사이가 되는 것입니다

TCP로 데이터를 전송하기 전에 3단계를 거쳐서 서로 관계를 맺습니다. 이렇게 TCP/IP 네트워크에서 서버와 클라이언트 사이 연결을 만드는 일련의 과정을 3way Handshake라고 부릅니다. 실제로 서버-클라이언트 간 HTTP 통신을 하기 전에는 TCP 연결이 선행되어야 합니다. 이는 HTTP 통신으로 서버와 클라이언트가 실제 데이터를 주고받기 전에 synchronization, acknowledgment 패킷들을 교환하며 서로가 통신 가능한 관계를 맺을 수 있는지 확인하는 과정이 먼저 진행됨을 알 수 있습니다.

Screenshot 2023-03-23 at 6 45 16 PM

  1. 처음에는 클라이언트가 서버와의 연결을 만듭니다. 이때 SYN 메시지를 보내면서 클라이언트가 서버와의 통신을 시작한다는 정보와 함께 시퀀스 넘버도 함께 보냅니다. SYN에 붙어있는 번호가 random sequence number입니다.
  2. 클라이언트의 요청을 받은 서버는 SYN-ACK 신호로 응답합니다. SYN과 ACK가 하나의 패킷에 포함되었기에 한번에 보낼 수 있습니다.
  3. 클라이언트가 서버의 응답을 인정합니다. 이로서 클라이언트와 서버는 안정적인 연결을 만들었고, 이를 기반으로 데이터를 주고받을 수 있습니다.

TCP Implemenation

// TCP
const net = require('net');

const server = net.createServer((socket) => {
  socket.write('Hello');
  socket.on('data', (data) => {
    console.log(data.toString()); // break point
  });
});

server.listen(8080);

앱을 디버거로 실행시킨 후, 터미널에서 telnet으로 호출해봅시다.

telnet 127.0.0.1 8080

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello

localhost와 연결되었다는 문구가 뜹니다. TCP 연결이 잘 되었다.

Connected to localhost.
Escape character is '^]'.
Hello. I love you

Hello 다음에 'I love you'라는 문구를 치고 엔터를 치면 데이터가 전송된다.

Screenshot 2023-03-20 at 9 44 39 PM


어플리케이션 터미널에서 잘 수신된다.

Connected to localhost.
Escape character is '^]'.
Hello. I love you
Yo~~

Yo~~ 라는 문구도 보내준다

Screenshot 2023-03-20 at 9 45 41 PM


Break pointer를 걸었기에 Buffer 데이터를 확인할 수도 있다.

Screenshot 2023-03-20 at 9 47 00 PM

이번에는 어플리케이션을 종료해보자.

종로하면 클라이언트의 터미널에서는..

Connected to localhost.
Escape character is '^]'.
Hello. I love you
Yo~~
Connection closed by foreign host.

foreign host에 의해 종료되었다는 문구가 뜬다.

UDP Implementation

// UDP
const dgram = require('dgram');
const socket = dgram.createSocket('udp4');

socket.on('message', (msg, rinfo) => {
  console.log(`Server got: ${msg} from ${rinfo.address}: ${rinfo.port}`); // break point
});

socket.bind(8081);
echo 'hi' | nc -w1 127.0.0.1 8081

netcat으로 1초 타임아웃으로 설정하여 요청을 보내면 확인할 수 있다.

Referene

'Research > Computer Science' 카테고리의 다른 글

parallel computing  (0) 2023.04.06
OOP in Javascript  (0) 2023.04.04
List, Set, Map, HashMap  (0) 2023.03.30
Parameter와 Argument의 차이  (0) 2023.03.30
MSA(MicroService Architecture)  (0) 2023.03.29

댓글