TCP UDP

Bennie97·2022년 2월 13일
0



TCP, UDP 모두 OSI 7 계층에서 Transport layer,즉 전송계층에 해당되는 프로토콜이다.

UDP (User Datagram Protocol)

  • UDP는 비연결형, 신뢰성 없는 전송 프로토콜이다.
    비연결형 서비스에서는 흐름제어나 오류 제어, 혼잡 제어가 없다.
    따라서 메시지가 순서에 맞지 않게 전달되거나 중간에 메시지가 누락되도 대책이 없다.
  • OSI 7 layer 중 전송계층에 해당한다.
  • 호스트 대 호스트 통신 대신에 프로세스 대 프로세스 통신으르 제공한다.
    원래 Transport 계층 아래 단계인 network 계층에서는 컴퓨터 레벨에서의 통신의 책임만 있었다. 즉 메세지를 목적지 컴퓨터에만 전달하는 책임만 졌다. 그러나 우리가 인터넷을 사용해서 여러가지 일을 하기 위해서는 프로세스 단계를 중간에 거쳐야 한다. UDP와 같은 전송계층에서는 프로세스 대 프로세스 통신을 제공하며 이를 위해 Port번호를 사용한다.
  • 작은 메세지를 보내고 신뢰성에 대해서 걱정 하지 않는 프로세스는 UDP를 사용할 수 있다.
  • DNS 에서는 UDP 서비스 사용한다.

포트 번호란?

프로세스를 식별하기 위한 번호
16비트로 0과 65535 사이의 정수이다.
보통 클라이언트의 프로세스들은 임시 포트 번호라고 하는 임시의 포트 번호로 자신을 지정한다.
반면 서버단에서의 프로세스들은 잘 알려진 well-known 한 port번호를 사용한다.

다음은 well known 포트 번호들의 예시이다.

UDP 헤더

UDP 헤더는 총 8바이트의 고정 크기의 헤더를 가진다.
1. Source Port : 송신측에서 메시지를 보내는 프로세스에서 사용되는 포트번호이다.
16비트(2바이트) 크기를 가진다.
2. Destination Port : 수신측에서 메시지를 받는 프로세스에서 사용되는 포트번호이다.
3. UDP length : UDP 헤더와 data를 합친 User datagram 전체의 길이이다.
4. CheckSum : 검사합. 오류 탐지하기 위해서 사용됨

udp의 최대 데이터 크기는 65,507 바이트 이다.
65,535 바이트 - UDP 헤더 8 바이트 - IP 헤더 20 바이트 = 65,507 바이트
https://scrapsquare.com/notes/udp-length 참조
http://www.ktword.co.kr/test/view/view.php?m_temp1=1796&id=744 참고

UDP 서비스

  • udp는 흐름제어 기능이 없다. 따라서 수신 측에서 overflow가 발생할 수 있고
    이는 프로세스에서 overflow 처리를 해주어야 한다.

  • udp는 오류제어 기능이 없다. 따라서 세그먼트가 손실되거나 중복될수 있다.

  • udp는 캡슐화, 역캡슐화를 한다. udp를 통하여 메세지를 보내고자 하는 프로세스는 udp로 메시지와 소켓 주소 데이터의 길이를 보낸다. 그러면 udp는 udp 헤더를 추가하고 그 밑에 IP 계층에 사용자 데이터그램을 보낸다. IP는 프로토콜 필드를 17로 설정한후 그 밑에 계층으로 보낸다. 역 캡슐화는 반대로 헤더를 없애가면서 checksum을 검사하면서 유효한 데이터인지 확인하며 위의 계층으로 보낸다.
    소켓이란? https://blog.naver.com/myca11/221389847130 참고

  • udp는 하나의 호스트에 있는 여러개의 프로세스로 부터 전송되는 user datagram을 처리하기 위하여 다중화(multiplexing)을 사용한다.

  • 또한 동일한 호스트에 있는 서로 다른 프로세스로 user datagram을 전달하기 위하여 역다중화(demultiplexing)을 사용한다.

multiplexing이란??

Application layer 에서 패킷이 소켓에 의해 Transport layer 로 전달 될 때, 여러 소켓의 패킷을 수집하여 하나의 세그먼트에 캡슐화하여 Network layer로 전달하는 과정

응용 사레

Voip (인터넷 전화), 실시간 스트리밍, DHCP, DNS 등에서 사용된다. 즉 데이터의 무결, 완전성 보다 속도가 더 중요한 곳에서 사용된다.

TCP(Transmission Control Protocol)

  • TCP는 연결지향, 신뢰성 있는 전송 프로토콜이다.
    따라서 흐름제어나 오류제어를 혼잡제어 등을 해준다.
  • 1대 1 통신방식이다.
  • UDP 보다 전송속도가 느리다.
  • OSI 7 layer 중 전송계층에 해당한다.
  • UDP와 마찬가지로 Port 번호를 사용한다.
  • TCP는 전이중 통신 서비스를 제공한다.
  • 송신 버퍼와 수신 버퍼를 가지고 있다.
  • UDP와 다르게 스트림 기반의 프로토콜이다.

TCP 특징

번호화 시스템

  • 바이트 번호
    TCP는 한 연결에서 전송되는 모든 데이터 바이트에 번호를 매긴다.
    프로세스로 부터 데이터 바이트를 수신하여 송신 버퍼에 보관하면 TCP는 각 바이트마다 번호를 붙인다. 이 바이트 순서화는 흐름 및 오류 제어에 사용 된다.
  • 순서번호 (Sequence Number)
    바이트에 번호가 매겨지면 TCP는 전송하고자 하는 세그먼트에 하나의 순서 번호를 할당한다. 각 세그먼트의 순서 번호는 그 세그먼트에 있는 첫 번째 바이트의 번호로 설정된다.
  • 확인응답 번호 (Acknowledgement Number)
    TCP가 제대로 바이트를 수신했다는것을 확인하기 위하여 주는 번호.
    즉 바이트를 제대로 받았다면 제대로 수신한 마지막 바이트의 번호에 1을 더해서 상대방에 전달한다.

흐름제어

송신 TCP는 송신 프로세스로부터 수신되는 데이터 양을 조절한다.
수신 TCP는 송신 TCP로 부터 전송되는 데이터 양을 조절한다.
이는 수신쪽에서 과도한 데이터 전송에 의한 데이터 손실을 방지한다.

오류제어

손실 또은 훼손된 세그먼트에 대해서 재전송 기반의 오류제어를 기본적으로 해준다.

혼잡제어

망의 혼잡도에 의해 송신측에서 전송되는 데이터 양 제한

TCP 세그먼트의 구조

  1. Source Port Address
    출발지 포트번호를 정의하는 16비트 필드이다.

  2. Destination Port Address
    목적지 포트번호를 정의하는 16비트 필드이다.

  3. Sequence Number
    세그먼트에 포함된 데이터의 첫 번째 바이트에 부여된 번호이다.

  4. Acknowledgment Numnber
    세그먼트를 수신한 노드가 다음 세그먼트를 받고자 할때 상대방 노드에게 알려주는 번호이다. 예를들어 수신 노드가 송신 노드로부터 x 바이트를 잘 받고 다음 x + 1바이트 부터 받고 싶다면 x + 1을 확인응답번호로 정의한다.

  5. HLEN
    헤더길이. TCP 헤더 길이를 4바이트 워드 개수로 나타낸다. TCP 헤더는 최소 20byte 최대 60byte이다. 따라서 이 값은 5~15사이의 값을 가진다.
    HLEN의 길이는 4bit로 최대 나타낼 수 있는 범위가 0부터 15이므로 가능하다.

  6. Reserved
    사용하지 않고 나중에 추후에 사용을 위해 예약된 필드이다.

  7. Flags(URG, ACK, PSH ...)
    제어 필드이다. 동시에 여러개가 1로 설정될 수 있으며, 흐름제어, 연결 리셋 연결종료 등을 위해서 사용된다.
    URG: Urgent pointer is valid
    ACK: Acknowledgement number is valid( used in case of cumulative acknowledgement)
    PSH: Request for push
    RST: Reset the connection
    SYN: Synchronize sequence numbers
    FIN: Terminate the connection

  8. Window Size
    송신 윈도우 사이즈를 나타낸다.

  9. Checksum
    검사합을 위해 존재한다. 헤더와 데이터의 에러를 확인하고
    UDP와 다르게 TCP는 이 과정이 필수이다.

  10. Urgent Pointer
    Flags의 URG가 1로 설정되어있을때만 유효하다.
    긴급 데이터 포함하고 있을때 사용되며
    이 필드 값과 Sequence Nubmer를 더하면 Segment 데이터 부분에 있는 마지막 긴급 바이트의 번호를 알 수 있다.

TCP 연결

TCP는 연결지향 프로토콜이며 스트림의 형태로 가상 튜브를 통해서 데이터를 전송하는 것과 같다. 이러한 것을 하기 위해서 TCP는 연결 설정과, 데이터 전송, 연결 종료 이렇게 세가지를 통하여 가능하게금 한다.

TCP 연결설정(3 way handshaking)

Client가 Server와 연결하는 상황이라 가정하자.
먼저 서버단에서 자신의 TCP에 연결 수락 준비가 되었다고 알린다. 이것을 passive open이라고 한다.
그리고 나서 client는 능동개방(Active open)을 하여 서버와 연결할 것이라는 준비를한다.
이제부터 본격적인 3단계 연결이 시작된다.

  • 첫번째로 클라이언트는 서버에게 SYN 세그먼트(SYN flag가 1로 되어있는) 를 전송한다. 이때 임의의 값을 첫번째 순서 번호로 선택한다. 여기선 8000으로 설정하였다.
  • 두번째로 서버에서는 두번째 세그먼트로서 SYN 과 ACK flag가 1로 설정되어있는 세그먼트를 클라이언트에 전송한다. 이 때 서버측에서는 반대방향(서버 -> 클라이언트)를 위한 바이트의 순서를 맞추기 위해서 Sequence number를 15000으로 설정하였고
    ACK 번호는 client로부터 수신한 syn 번호 + 1로 설정해서 client 에보낸다.
  • 세번째로 client에서 단순한 ACK 세그먼트를 만들어서 서버에 전송한다.
    이때 ACK의 값은 두번째 단계에서 서버가 보냈던 SYN + 1값으로 설정하고
    Sequence number는 8001로 설정하여 보낸다. 참고로 이 세 번째 세그먼트는 Sequence Number를 소비하지 않는다.

TCP 연결종료(4 way handshaking)

  1. 서버나 클라이언트가 반 닫기를 요청한다. 여기서는 왼쪽이 클라이언트 오른쪽이 서버라 가정하자. 먼저 클라이언트가 FIN 세그먼트를 보낸다.
  2. 서버가 FIN을 받고 ACK를 클라이언트에 전송한다. 이 상황에서 서버는 여전히 데이터를 전송할수가 있다. (반 닫기 상태)
  3. 서버가 데이터를 다 전송했다면 FIN메세지를 클라이언트에 보낸다.
  4. 클라이언트가 FIN을 받고 ACK를 다시 서버한테 보낸다.

tcp와 udp 의 공통점

둘다 다중화, 역 다중화를 사용한다.
프로세스 대 프로세스의 통신이다.

tcp와 udp의 차이점

tcp는 연결지향, 신뢰성을 보장하지만 udp는 그렇지 못한다.
tcp는 패킷 기반의 스트림 기반의 프로토콜이지만 udp는 독립적인 user datagram을 사용한다.

참고자료
https://www.techtarget.com/searchnetworking/definition/UDP-User-Datagram-Protocol
https://www.geeksforgeeks.org/services-and-segment-structure-in-tcp/
http://www.deadfire.net/tcpip/tcpip20.html

profile
현명한개발자가되자

0개의 댓글