본문 바로가기

개발일지/Spring

[Server] TCP와 UDP

TCP; Transmission Control Protocol

 

 

연결지향형 프로토콜, 즉 송신자와 수신자가 양방향 소통을 한다

패킷을 한 컴퓨터에서 다른 컴퓨터로 전달해주는 IP 프로토콜로,

신뢰성이 요구되는 애플리케이션에서 사용한다

안정적이고, 혼잡 제어와 흐름 제어가 가능하다!

하지만 데이터 전송 순서가 보장되면서 상대적으로 느리다..라는 것

 

  • 연결형 서비스
  • byte 스트림으로 연결한다
  • 흐름 / 혼잡 제어 O
  • 신뢰성 GOOD
  • 전이중 방식 (Full-Duplex) : 양방향 동시 전송 가능
  • 점대점 (Point to Point) : 1대1, 2개의 종단점

 

TCP Header

 

  • Source Port, Destination Port : 송/수신자의 포트 번호 주소
  • Sequence Number : 시퀀스 번호 - 전송되는 바이트 수를 기준으로 증가
  • ACK Number : 응답 번호 - 제대로 수신한 바이트의 수를 응답하기 위함
  • Data Offset : 데이터 시작 위치
  • Reserved : 예약 필드 - 나중을 위함, 일단 0으로 채워짐
  • Flag Bit : 제어 비트 : SYN, ACK, FIN 등 제어번호
    • URG
    • ACK : 응답 번호 필드가 유효한지 설정
    • PSH
    • RST
    • SYN : 연결 설정으로, 양쪽이 보낸 최초 패킷에만 설정되어야 한다
    • FIN : 연결 종료
  • Window : 윈도우 크기 - 수신 윈도우 버퍼 크기를 지정
  • Checksum : 체크섬 - 데이터 오류 검출용
  • Urgent Pointer : 긴급 위치

 

TCP의 연결 및 해제 과정

 

TCP Connection (3-way handshake)

  1. oepn()을 실행한 클라이언트가 SYN을 보내고, SYN_SENT 상태 (대기)
  2. 서버는 SYN_RCVD로 변경, SYN + 응답 ACK 보냄
  3. SYN, ACK를 받은 클라이언트는 ESTABLEISHED 상태로 바꾸고 서버에 응답 ACK를 보냄
  4. 서버는 응답 ACK를 받고 ESTABLISHED 상태로 변경됨

 

TCP Disconnection (4-way handshake)

  1. close()를 실행한 클라이언트는 FIN을 보내고 FIN_WAIT1 상태로 대기
  2. 서버는 CLOSE_WAIT 으로 변경 후 응답 ACK를 전달한다, 그리고 동시에, 해당 포트에 연결된 앱에게 close() 요청
  3. ACK를 받은 클라이언트는 FIN_WAIT2 상태로 변경
  4. close() 요청을 받은 서버 앱은 종료 프로세스를 진행, 그리고 FIN을 클라이언트에 보내 LAST_ACK 상태로 바꾼다
  5. 클라이언트가 FIN을 받으면, ACK를 서버에 다시 전송하고, TIME_WAIT으로 상태를 바꾼다
  6. TIME_WAIT 에서 일정 시간이 지나면 CLOSED 된다
  7. ACK를 받은 서버도 포트를 CLOSED 로 닫는다
 💡 반드시 서버만 CLOSE_WAIT 상태를 갖지는 않는다!
서버가 먼저 FIN을 보내고 종료 요청을 할 수 있는데, 이럴 땐 서버가 FIN_WAIT1 상태가 된다

 

 

 

UDP; User Datagram Protocol

비 연결지향형 프로토콜 이라는 건데, 쉽게 말해서 송신자의 일방적인 소통이라고 생각하면 되겠다

 

실시간 유튜브 스트리밍을 생각해보자

송신자는 보내기만 하면 되는 거니까, 수신자에게 데이터가 잘 전송 됐는지는 몰라도 된다 !

그럼 데이터 전송과 순서는 보장되지 않고, 혼잡 제어와 흐름 제어 등을 지원하지 않는다는 것을 유념해야 한다

대신에, UDP는 간단한 데이터를 빠르게 전송할 수 있다

 

  • 비연결형 서비스
  • message 스트림으로 연결한다
  • 흐름 / 혼잡 제어 X
  • 신뢰성은 적음
  • 데이터 전송 속도가 빠르다
  • 1대1, 1대다, 다대다 통신 가능

 

UDP 헤더

UDP 헤더를 추가하고, 이를 IP로 보내는데

이 때의 UDP 헤더는 TCP 헤더에 비해 정보가 많이 없다

얘는 송/수신자의 포트 번호, 데이터 길이, Checksum

4개의 정보만을 헤더에 담아서, 모두 16bit 로 보낸다!

확실히… 신뢰성을 보장해주는 것 같은 느낌은 안 들지만 간단하고 빠르다는 것

 

 

[참고]

https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4