CS
[네트워크] TCP와 UDP 차이, TCP는 어떻게 순서를 보장하는가?
그레고리력
2021. 3. 20. 22:38
TCP/UDP는 모두 데이터를 보내기 위한 통신 프로토콜
- 네트워크 5계층 링크
- 전송계층은 송신자와 수신자를 연결하는 통신서비스를 담당
- TCP/UDP는 이 전송계층에서 데이터를 보내기 위해 사용하는 프로토콜
- 둘 다 데이터 오류 검사를 위한 체크섬필드가 존재(헤더에 존재)
UDP
- 데이터그램 UDP 패킷
- 메세지 스트림(데이터그램, 하나하나의 패킷이 독립적으로 발신, 수신 단말기의 정보를 저장하고 있음)을 통한 연결
- 상대적으로 빠름
- 목적 포트로 패킷을 보냄
- 브로드캐스트와 멀티캐스트 가능
UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜) 특징
- 비연결형 프로토콜
- 흐름제어, 오류제어 또는 손상된 세그먼트의 수신에 대한 재전송을 하지 않음
- 흐름제어와 혼잡제어 :데이터를 송신과 수신시 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지하는 것
- 응용 계층에서 흐름 제어와 혼잡 제어를 구현해서 부족한 신뢰성을 보완하기도 함
UDP의 사용
- DNS, IP 주소를 찾을 필요가 있는 프로그램은 DNS 서버로 UDP 패킷을 보냄 -> 서버는 호스트의 IP 주소를 포함한 UDP 패킷 응답 -> 사전 설정 및 해제가 필요하지 않음
- 실시간 동영상 스트리밍(몇 프레임을 잃어버려도 상관없음)
왜 TCP는 브로드캐스트가 불가능한가?
- TCP는 3-way로 연결을 확립하고 각각 흐름제어, 에러제어를 해야하기 때문에 각 상대방마다의 버퍼도 준비해야 함
- 매번 다른 메시지를 보내야 하고 각각 커넥션을 확립해야 해서 굉장히 복잡
- 상대방이 있는지 없는지 모르는 경우 TCP는 불가능
- 따라서 브로드캐스트 통신이 필요한 경우 UDP사용
TCP
- 연결지향형 프로토콜(TCP는 시퀀스 순서에 따라 데이터를 보내지만 그 순서대로 도착하는 것은 아님, 나중에 헤더에 존재하는 시퀀스 넘버로 재조립)
- 바이트 스트림(바이트와 같이 연속된 데이터를 전송하는 것, 데이터 경계를 구분 안 함)을 통한 연결
- 세그먼트 TCP 패킷(TCP header + data section)
- HTTP, Email, File transfer
- 혼잡제어, 흐름제어, 신뢰성 있는 데이터, 순서 보장, 상대적으로 느림
TCP(Transmission Control Protocol, 전송제어 프로토콜) 특징
- 신뢰성
- 순차적인 전달
- 전이중(full-duplex): 전송이 양방향으로 동시에 일어날 수 있음, 두 대의 단말기가 데이터를 송수신하기 위해 동시에 각각 독립된 회선을 사용하는 통신 방식
- 점대점(point to point): 각 연결이 정확히 2 개의 종단점을 가지고 있음
- TCP 는 멀티캐스팅, 브로드캐스팅을 지원하지 않음
어떻게 신뢰성과 순차적인 전달을 달성하는가?
- TCP 서비스는 송신자와 수신자 모두가 소켓이라고 부르는 종단점을 생성함으로써 이루어진다.
- TCP 에서 연결 설정은
3-way handshake
를 통해 행해진다. (3-way handshake 링크
- 응용 계층으로부터의 데이터에 TCP헤더를 추가해 이를 IP로 보냄
TCP 헤더

- 필드 내용 크기
- 송수신자의 포트 번호, 데이터 오프셋(Data Offset, TCP 헤더의 길이), 예약 필드(Reserved), 윈도우 크기(Window size, 한번에 수신할 수 있는 데이터 크기), 체크섬(Checksum), 긴급 위치(Urgent Pointer)
- 시퀀스 번호(Sequence Number): 송신자가 지정하는 순서 번호, 전송되는 바이트 수를 기준으로 증가, 송신한 바이트 수
- 응답 번호(ACK Number): 수신 프로세스가 제대로 수신한 바이트의 수를 응답하기 위해 사용, 수신한 바이트 수
- 제어 비트(Flag Bit): SYN, ACK, FIN 등의 제어 번호
- ACK 번호를 사용하여 패킷이 도착했는지 확인하고 패킷이 도착하지 않으면 재송신을 요구한다.
- TCP control flags : 현재 통신 상태를 표현하는 플래그 역할
- UGR(urgent): 긴급 포인터에서 지정한 데이터를 즉시 처리해야 한다는 것을 알려줌
- ECE : 통신 경로 혼잡, 수신할 수 없을 수도 있다는 것을 알려줌
- CWR : 통신 경로 혼잡, 전송량을 줄여줄 것을 알려줌
- ACK(acknowledge): 응답 번호 필드가 유효한지, 최초의 SYN 패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어야 함, 이전 동작을 확인했다는 것을 알려줌
- PSH(push) : 수신 데이터를 즉시 응용 계층에 전달해야 할 때
- RST(recent) : 이상 상황 발생으로 접속이 강제 중단되었다는 것을 표시
- SYN(synchronize): 연결 설정 요구, 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정
- FIN(finish) : 데이터 송신 완료, 통신 종료를 원할 때
일련 번호의 변화
- 커넥션을 맺는 과정에서 일련번호는 1씩 증가, 데이터를 전송할 때 여기에 전송한 데이터 바이트 수만큼 더해짐, 수신 후에는 확인 응답 번호에 수신한 바이트 수만큼 더해줌
- 일련번호와 응 답 확인 번호 정보를 관리하면서 데이터가 제대로 송수신 되었는지 확인
- 캡슐화할 때 한 개의 데이터를 MSS(maximum segment size)로 분할하는데 각 세그먼트에 번호를 부여하고 이를 시퀀스번호라고 함
- 송신할 데이터의 맨 앞부분부터 번호를 붙이고 송신할 세그먼트의 선두 번호를 시퀀스 번호로 함
- 통신할 데이터의 임의의 번호부터 순서대로 8비트마다 번호를 할당, 3000바이트를 1000바이트씩 나눌때 시퀀스번호는 1(예시), 1001, 2001
- 확인 응답번호는 다음에 수신할 예정의 시퀀스 번호를 보낸다, 1-1000까지 받을 경우 받는 시퀀스번호는 1, 확인응답번호는 1001을 보냄
- 확인응답번호를 통해서
송신 실패 여부
- RTT(round trip time) : 지금까지 보낸 데이터에 대해 확인응답이 돌아오기까지 걸린 시간
- 일정 시간 후에도 수신 측으로부터 응답이 오지 않으면 정상 응답 이후의 데이터를 재전송함
전송 속도 향상(윈도우 제어)
- 응답을 기다리지 않고 연속으로 데이터를 보내면 전송 속도가 빨라짐
- 수신측은 일시 보관 장소인 버퍼를 지니고 수신측은 TCP 헤더의 윈도우사이즈에 버퍼 크기를 설정하고 송신 측에 통보함
- 수신 측은 응답을 보낼 때 윈도우 사이즈를 설정하여 어느 정도 까지 수신할 수 있는지를 수시로 알려줌, 이를 흐름제어라고 함
- 버퍼에 공간이 있어도 네트워크가 혼잡하면 ECE나 CWR 플래그를 사용해서 통신속도를 조절함,혼잡제어
참고
- 브로드캐스트: 1대 전체, 2계층의 브로드캐스트는 세그먼트 내의 모든 기기, UDP를 기반으로 자신의 호스트가 속해 있는 네트워크를 대상의 모든 수신자에게 패킷을 전송하는 방법, 불특정다수
- 멀티캐스트: 1대 다수(특정 그룹), 다수의 수신자에게 패킷을 전송하는 방법, 대신 수신 대상이 정해져 있음
- 노드(Node) :네트워크에 연결된 모든 종류의 장치
- 호스트(Host): 노드 중에서도 네트워크 주소(IP 주소)가 할당된 장치
- Port(포트): 네트워크에 연결된 컴퓨터에서 실행되는 특정 서비스로 트래픽을 보내는데 사용되는 16비트 숫자
- 호스트에서는 여러 프로세스가 동시에 동작, 데이터는 프로세스 레벨에서 주고받음, 포트는 호스트 내부적으로 프로세스가 할당받는 값
- Socket(소켓): TCP 연결에서 end point의 인스턴스화(다른 곳에 정의된 무언가의 실제 구현)
- 프로토콜, IP 주소, 포트 넘버로 정의되며 실제적인 창구같은 개념
- 아무 포트에 트래픽을 보낼 수 있지만 소켓을 연 경우에만 응답을 얻을 수 있음
- LISTEN : 소켓이 준비가 된 상태
- SYN-SENT, SYN-RECEIVED
- ESTABLISHED, FIN_WAIT, CLOSE_WAIT, CLOSED
포트
- 통신 데이터를 흐르기 위한 일종의 가상의 출입구, 포트 번호로 데이터를 보낼 어플리케이션을 특정
- 웰 노운 포트(well-known ports) : 응용 계층에서 많이 사용되는 대표적인 프로토콜의 수신 포트들(자주 사용하는 서버 어플리케이션), 서버 프로그램이 수신 대기할 때 사용하는 포트, 1~1023번
- 1024~49151번은 등록된 포트(레지스터드포트)
- 레지스터드 포트 : 벤더가 할당받아 사용하는 포트
- 다이나믹 포트 : 클라이언트 프로그램이 사용, 49152~65535번, 클라이언트가 사용하는 포트 번호는 그때그때 다르다(임의로 사용)
- 클라이언트의 포트 번호와 IP 주소로 상대방을 식별한다(서버측)