-
네트워크 기초 (1)뜯고 또 뜯어보는 컴퓨터/네트워크(Network) 2022. 10. 5. 15:38반응형
TCP와 UDP의 기본적인 정의, 특징, 비교
TCP/IP 스택은 총 4단계로 이루어져 있는데, LINK계층 <-> IP 계층 <-> TCP/UDP 계층 <-> Application 계층으로 이루어져 있다. 이는 '인터넷 기반의 효율적 데이터 전송'을 해결하기 위하여, 설계된 패러다임으로 하나의 큰 프로토콜 설계로 해결한 것이 아닌 문제를 작게 만들어 해결한 것입니다.
TCP/UDP 계층은 '전송 계층' 이라고 불리기도 하는데, TCP와 UDP 모두 연결된 다른 네트워크와 통신하기 위한 프로토콜로 정의할 수 있다. 결론적으로 말하면, IP의 상위계층에서 Host 대 Host의 데이터 송수신 방식을 약속한 것을 TCP 그리고 UDP라고 할 수 있겠다.
TCP / UDP의 간략한 특징은 다음과 같다.
TCP UDP 연결 방식 연결형 서비스 비연결형 서비스 패킷 교환 방식 가상 회선 방식 데이터그램 방식(메시지 방식) 전송 순서 전송 순서 보장 전송 순서 보장 X 수신 여부 확인 O X 통신 방식 1:1통신 1:1 | N:N 신뢰성 높음 낮음 속도 느리다 빠르다 TCP가 UDP 보다 빠른 이유
UDP는 TCP와 달리 흐름 제어를 진행하지 않는다. 이 흐름 제어는 소켓의 연결과 종료, 그리고 데이터 송수신 전반에 걸쳐서 진행되기 때문에 TCP의 데이터 전송은 언제나 신뢰할 수 있다. 반면 UDP는 이러한 흐름 제어를 진행하지 않으니, 데이터의 전송을 신뢰할 수 없다. 하지만 UDP는 흐름 제어를 진행하지 않기 때문에 TCP보다 빠른 데이터의 송수신이 가능하다는 이점이 있다.
TCP 헤더의 각 필드와 그 역활 / UDP 헤더 구성
TCP 헤더 구조는 위의 그림과 같으며,
- Source Port 와 Destination Port 는 각각, 송신측 수신측 의 통신 Port입니다.
- Sequence Num 은 송신 바이트 흐름의 위치를 가르키며, 패킷의 순서를 보장해줍니다.
- ACK 는 Acknowledgement number 의 약자이며, 다음 받을 것으로 예상되는 옥텟의 순서 번호를 의미.
- CodeBits 중, SYN, ACK, RST를 주목할 필요가 있는데,
- SYN 는 동기화를 위한 목적으로, Three-way HandShaking 을 위해 사용.
- ACK 는 원격 호스트의 Sequence Num에 대한 응답으로 사용.
- RST 는 설정시 즉시 연결을 끊는 용도로 사용.
- CheckSum 은 데이터 변조의 가능성을 막기 위한 장치를 의미
- UrgentPointer 는 긴급 메시지를 의미하며, 따로 패킷을 보내는 것이 아닌, 포인터의 시작위치를 의미.
UDP 헤더의 구성은 다음과 같으며,
- Source Port : 클라이언트의 포트번호
- Destination Port : 목적지(서버)의 포트번호
- UDP length : UDP 헤더와 User Data의 크기를 더한 전체 패킷의 크기
- CheckSum : 데이터 변조의 가능성을 막기 위한 장치를 의미 / 만약 손상시, Application 계층으로 전달되지 않는다.
TCP Checksum 동작 원리
TCP가 Checksum 을 하는 이유는 송신도중 발생될 수 비트 오류를 검출하기 위해 체크섬을 사용한다. TCP CheckSum 의 작동 순서는
- TCP 체크섬 계산에 사용되는 헤더 및 데이터를 16비트 단위로 분할
- 각각의 분할에 대하여, 합을 구하는 데, 만약 Carry 가 발생시, Warp Overlapped 를 계산한다.
- 위의 1~2를 반복
TCP ACK-SEQ 동작 원리
client server ① Send SYN seq=x ---------------------------> Receive SYN segment | ② | Recevie SYN+ACK segment <-------------------------- Send SYN seq=y, ACK x+1 | | ③ send ACK y+1 --------------------------> Receive ACK segment
TCP 에서 ACK 는 다음 데이타 옥텟의 순서번호를 의미하며, SEQ 는 데이터의 송신 바이트 흐름의 위치를 나타낸다. Squence Number는 TCP 세그먼트의 연속된 데이터 번호를 의미하며, ACK Number는 상대방으로 부터 받아야하는 다음 TCP 세그먼트 데이터 번호입니다.
TCP 상태
TCP 의 상태 전이에는 다양한 형태들이 존재하게 되는데, 다음과 같다.
상태 설명 TCP 연결 설정 CLOSED 연결 상태가 아님. SYN-SENT 클라이언트가 능동적으로 SYN 세그먼트를 보내고, ACK을 기다리는 상태. LISTEN SYN 세그먼트를 기다리며, 수동적으로 개방 대기 중인 상태.
서버가 SYN-SENT를 수신하면, SYN-ACK 송신후, SYN-RECEIVED로 전이SYN-RECEIVED SYN 세그먼트 수신후, ACK 응답 대기 상태 TCP 연결 성립 유지 ESTABLISHED 연결 회선 성립 / 양방향 데이터 전송 가능 TCP 종료 상태 CLOSE-WAIT TCP 가 어플리케이션 종료를 기다림 LAST-ACK 서버는 자신이 송신한 FIN 세그먼트에 대한 ACK 대기 FIN-WAIT-1 자신이 보낸 FIN 세그먼트에 대한 ACK를 기다리고, 상대측 FIN을 기다림 FIN-WAIT-2 FIN 세그먼트를 송신하고, 상대측은 이에 대한 ACK 를 송신 ClOSING 양쪽이 동시에 닫기로 한 상태 TCP 3way-hand-shaking의 정의, 이유, 각 과정에서 일어나는 일
TCP 3-HandWay Shaking의 경우, 다음과 같은 과정을 거치게 됩니다.
- 서버는 Listen 상태에서, 클라이언트의 연결 요청 신호를 대기 하게 되며,
- 클라이언트 측에서, SEQ 패킷을 설정하고, ACK 패킷은 0으로 초기화하여, 보내주게 된다.
- 서버는 클라이언트로 패킷을 받고, ACK = SEQ+1 로 설정하고, 다른 SEQ 번호를 설정하여, 2번 패킷을 클라이언트에 보내게 된다.
- 클라이언트는 서버로부터 패킷을 받은다음, 넘어온 ACK 를 확인한다. 이때 클라이언트가 서버측에 보낸 SEQ + 1 갑이 ACK 에 들어있으므로, 올바른 값임을 확인한다. 그리고 2에서 넘어온 ACK 를 자신의 SEQ 로 설정하고, SEQ + 1 의 값을 ACK 로 설정하여 서버로 보낸다. 이로써 3-HandWayShaking 이 완료되게 된다.
TCP 4way HandShaking과 다양한 연결종료 상태 / 우아한 종료
TCP 의 연결종료는 4-Way HandShaking 과정을 거치게 되는데, 이는 다음과 같다.
client server ① Send SYN seq=x ---------------------------> Receive FIN segment | ② | Recevie segment <-------------------------- Send ACK x+1 ① Receive FIN + ACK segment <-------------------------- Send FIN seq=y, ACK x+1 | | ② Send ACK y + 1 --------------------------> Receive ACK segment
TCP 의 연결 종료는 서버, 클라이언트 둘다에서 발생할 수 있으므로, 종류를 나눌 필요가 있습니다. 이를 Active Close 와 Passive Close 로 나누는데,
- Active close: TCP 연결 해제 요청한 쪽, 트래픽을 전송(request)하고 정상적으로 전송 되었으면 연결을 종료하는 쪽
- Passive close: TCP 연결 해제 요청을 받은 쪽, 트래픽을 받는 쪽(api 서버라고 치면 클라이언트에게 응답을 주는 쪽)
위의 그림은 Client 가 Active close 상태임을 나타낸 것으로, Client 에서 연결 종료 요청을 보낸 것을 나타내었다.
Active close
- 클라이언트는 FIN을 전송하고 FIN-WAIT-1 상태로 전환
- 클라이언트는 FIN에 대한 ACK를 수신하고 FIN-WAIT-2 상태로 전환
- 클라이언트는 FIN을 수신하면 ACK를 전송하고 TIME-WAIT 상태로 전환
- TIME-WAIT 상태로 2MSL 동안 남아있는다.
- 타이머가 만료되면 클라이언트는 CLOSED 상태가 된다.
FIN-WAIT-2 상태에서는 일정시간이 지나면 TIME-WAIT로 전환된다.
Passive close
- 서버는 FIN을 수신하고 ACK를 보낸다. CLOSE-WAIT 상태로 전환
- 프로세스로부터 passive close 명령을 받으면 서버도 FIN을 전송한다. LAST-ACK 상태로 전환
- LAST-ACK 상태로 있다가 클라이언트로부터 온 마지막 ACK를 수신하면 CLOSED 상태가 된다.
Reference
- https://www.ibm.com/docs/ko/aix/7.1?topic=management-transmission-control-protocolinternet-protocol
- W. Richard Stevens 「TCP/IP Illustrated」
- 윤성우 「열혈 TCP/IP 소켓 프로그래밍」
- https://www.joinc.co.kr/w/Site/TCP_IP
- https://smjeon.dev/etc/tcp-state/
- https://tech.kakao.com/2016/04/21/closewait-timewait/
반응형