TCP / UDP
TCP와 UDP
💡 네트워크 계층 중 전송 계층에서 사용하는 프로토콜
TCP(Transmission Control Protocol)
연결 지향적 프로토콜
클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜
클라이언트가 연결요청하고 서버가 연결을 수락
이때, 사용하는게 3 way handshacking
그리고 통신선로가 고정되고 데이터가 순차적으로 전달
⇒ 데이터를 정확하고 안정적으로 전달 가능
패킷을 성공적으로 전송하면 ack 신호 전송
지연시 timeout 이 발생하고 패킷을 재전송함
⇒ 신뢰성 있는 데이터 전달
마지막으로 4 way handshacking으로 연결 해제
TCP 특징
- 인터넷에서 데이터를 세그먼트로 보내기 위해 IP와 함께 사용하는 프로토콜 IP가 데이터의 배달을 처리, TCP는 패킷을 추적 및 관리
- 연결형 (connnection-oriented) 서비스로 연결이 성공해야 통신이 가능
- 데이터의 경계를 구분하지 않음(바이트 스트림 서비스 → 세그먼트로 관리 하는것)
- 데이터의 전송 순서를 보장 (데이터의 순서 유지를 위해 각 바이트마다 번호를 부여)
- 신뢰성있는 데이터 전송 (Sequence Number, Ack Number를 통한 신뢰성 보장)
- 데이터 흐름 제어(수신자 버퍼 오버플로우 방지) 및 혼잡 제어(패킷 수가 과도하게 증가하는 현상 방지)
- 3-way handshaking을 통해 연결 설정, 4-way handshaking을 통해 연결 해제
- 전이중(Full-Duplex), 점대점(Point to Point) 서비스
- 1:1 통신만 가능
- UDP 보다 느린 전송속도
TCP Header
필드 | 크기 | 내용 |
송수신자의 포트 번호 | 16 | TCP로 연결되는 가상 회선 양단의 송수신 프로세스에 할당되는 포트 주소 |
시퀀스 번호(Sequence Number) | 32 | 송신자가 지정하는 순서 번호, 전송되는 바이트 수를 기준으로 증가 |
응답 번호(ACK Number) | 32 | 수신 프로세스가 제대로 수신한 바이트 수를 응답하기 위해 사용 |
데이터 오프셋(Data Offset) | 4 | TCP 세그먼트의 시작 위치를 기준으로 데이터의 시작 위치를 표현(TCP 헤더의 크기) |
예약 필드(Reserved) | 6 | 사용을 하지 않지만 나중을 위한 예약 필드이며 0으로 채워져야한다. |
제어 비트(Flag Bit) | 6 | SYN, ACK, FIN 등의 제어 번호 |
윈도우 크기(Window) | 16 | 수신 윈도우의 버퍼 크기를 지정할 때 사용. 0이면 송신 프로세스의 전송 중지 |
체크섬(Checksum) | 16 | TCP 세그먼트에 포함되는 프로토콜 헤더와 데이터에 대한 오류 검출 용도 |
긴급 위치(Urgent Pointer) | 16 | 긴급 데이터를 처리하기 위함, URG 플래그 비트가 지정된 경우에만 유효 |
TCP Flag Bit
종류 | 내용 |
ACK | 응답 번호 필드가 유효한지 설정할때 사용하며 상대방으로부터 패킷을 받았다는 걸 알려주는 패킷. 클라이언트가 보낸 최초의 SYN 패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어야 한다. |
SYN | 연결 설정 요구. 동기화 시퀀스 번호. 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정되어 있어야 한다.TCP 에서 세션을 성립할 때 가장먼저 보내는 패킷, 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 데에 사용되며 초기에 시퀀스 번호를 보내게 된다. |
PSH | 수신 애플리케이션에 버퍼링된 데이터를 상위 계층에 즉시 전달할 때 사용 |
RST | 연결의 리셋이나 유효하지 않은 세그먼트에 대한 응답용으로 사용 |
URG | 긴급 위치를 필드가 유효한지 설정 (긴급한 데이터는 다른 데이터에 비해 우선순위가 높음) |
FIN | 세션 연결을 종료시킬 때 사용되며 더 이상 전송할 데이터가 없을 때 연결 종료 의사 표시 |
단, CWR, ECE는 거의 사용하지 않음
RST는 강제성이 있어서 공격자가 이용함(보안위협)
3 way handshaking 방식
TCP 통신을 위한 네트워크 연결은 3 way handshake 방식으로 연결
서로의 통신을 위한 port를 확인하고 연결하기 위하여 3번의 요청/응답 후에 연결하는 것
TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정
3-way handshaking (연결 과정)
💡 TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정하는 과정
Client가 Server에 연결을 요청
A -> B: SYN
- 접속 요청 프로세스 A가 연결 요청 메시지 전송 (SYN)
- 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- PORT 상태 - B: LISTEN, A: CLOSED
B -> A: SYN + ACK
- 접속 요청을 받은 프로세스 B가 요청을 수락했으며, 접속 요청 프로세스인 A도 포트를 열어 달라는 메시지 전송 (SYN + ACK)
- 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송
- PORT 상태 - B: SYN_RCV, A: CLOSED
A -> B: ACK
- PORT 상태 - B: SYN_RCV, A: ESTABLISHED
- 마지막으로 접속 요청 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
- 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.
- PORT 상태 - B: ESTABLISHED, A: ESTABLISHED
4-way handshaking (연결 해제 과정)
💡 TCP의 연결을 해제하는 과정
Client가 Server에 연결 해제를 요청
A -> B: FIN
- 프로세스 A가 연결을 종료하겠다는 FIN 플래그를 전송
- 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
B -> A: ACK
- 프로세스 B는 일단 확인 메시지를 보내고 자신의 통신이 끝날 때까지 대기(TIME_WAIT 상태)
- 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송
- 그리고 자신이 전송할 데이터가 남아있다면 이어서 계속 전송
B -> A: FIN
- 프로세스 B가 통신이 끝났으면 연결 종료 요청에 합의한다는 의미로 프로세스 A에게 FIN 프래그를 전송
A -> B: ACK
- 프로세스 A는 확인했다는 메시지를 전송
TCP재전송
TCP는 데이터의 전송을 보장하기 때문에 문제가 있을 때 재전송하는 기능이 있음
TCP는 송신에 대한 응담이 오지않는 경우 일정시간 대기 후 재전송
- 패킷 유실
- ACK 유실
- 이른 타임아웃
타임아웃을 너무 짧게 잡으면, 불필요한 재전송이 생기고, 길게잡으면 재전송을 판단하기까지 시간을 낭비함 ⇒ 최적의 알고리즘이 필요
UDP
전송계층의 비연결 지향적 프로토콜
연결 절차를 거치지 않고 발신자가 일방적으로 데이터를 발신하는 방식
연결 과정이 없기 때문에 TCP보다는 빠른 전송을 할 수 있지만 데이터 전달의 신뢰성은 떨어짐
발신자가 데이터 패킷을 순차적으로 보내더라도 이 패킷들은 서로 다른 통신 선로를 통해 전달 될 수 있음
먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 도착할 수 있으며 최악의 경우 잘못된 선로로 전송되어 유실될 수도 있음
중간에 패킷이 유실이나 변조가 되어도 재전송을 하지 않음
UDP의 특징
- 비연결형 서비스로 연결 없이 통신이 가능하며 데이터그램 방식을 제공한다.
- 데이터 경계를 구분한다. (데이터그램 서비스)
- 정보를 주고 받을때 정보를 보내거나 받는다는 신호절차를 거치지 않는다.
- 신뢰성 없는 데이터를 전송한다. (데이터 재전송과 데이터 순서 유지를 위한 작업을 하지 않는다.
- 패킷관리가 필요하다.
- 패킷 오버헤드가 적어 네트워크 부하가 감소되는 장점.
- 상대적으로 TCP보다 전송속도가 빠르다.
UDP Header
필드 | 크기 | 내용 |
송신자의 포트 번호 | 16 | 데이터를 보내는 어플리케이션의 포트 번호 |
수신자의 포트 번호 | 16 | 데이터를 받을 어플리케이션의 포트 번호 |
데이터의 길이 | 16 | UDP 헤더와 데이터의 총 길이 |
체크섬(Checksum) | 16 | 데이터 오류 검사에 사용 |
TCP vs UDP
TCP | UDP |
연결형 | 비 연결형 |
신뢰성 | 신뢰성X |
1:1 통신 | 1:N 통신 |
Byte Stream | Datagram |
에러복구 | 에러복구X |
재전송 요구 | 재전송 요구X |
경로 확인 | 경로 확인X |
트래픽 확인 | 트래픽 확인X |
수신 확인 | 수신 확인X |
준비 확인 | 준비 확인X |
속도 낮음 | 속도 빠름 |
Reference
https://coding-factory.tistory.com/614