이전 포스팅에서 TCP에 대해서 많이 부족하다고 느껴, 이번 포스팅을 작성한다.
가장 먼저, 이전 포스팅의 의문점인 “TCP가 패킷을 신뢰성을 지닌 데이터로써 전송을 보장하는 방법은??” 에 대해서 아래와 같이 대답할 수 있다.
- 흐름제어
- 오류제어
- 혼잡제어
이에 대해서 알아보기 위해 Transport Layer와 TCP 그리고 UDP에 대해서 얘기해보자!
이에 대해 알아보는 이유는 아래와 같다.
- TCP, UDP의 특성을 파악 후, 상황에 따라 적절한 프로토콜을 사용할 수 있기 위해
- TCP, UDP Header에 대해 파악하고 성능 개선에 이용하기 위해
Transport Layer
: End Point간 신뢰성있는 데이터 전송을 담당하는 계층
쉽게 말해, 데이터의 전달을 담당한다고 생각해도 좋다
신뢰성: 데이터를 순차적, 안정적인 전달
전송: port 번호에 해당하는 프로세스에 데이터를 전달
Transport Layer가 없다면, 데이터 손실이 일어날 수 있다.
→ 순차적 전달을 보장x
→ Flow Control(흐름 제어): 송수신자 간의 데이터 처리 속도차이 발생 (ex 수신자쪽 데이터 용량 초과)
→ Congestion Control(혼잡 제어): 네트워크 데이터 처리 속도(ex Router)
ex) “Hello” → “H l “로 올 수 있다.
데이터 손실을 방지하고자 나온 것이 바로 TCP인 것이다.
TCP (Transmission Control Protocol)
: 신뢰성있는 데이터 통신을 가능하게 해주는 프로토콜
특징
- Connection-Oriented (연결 지향) 프로토콜 (즉, 연결이 성공해야 통신 가능)
- 데이터 순차 전송을 보장 (데이터의 순서 유지를 위해 각 바이트마다 번호를 부여)
- 흐름 제어(수신자 버퍼 오버플로우 방지) 및 혼잡 제어(패킷 수가 과도하게 증가하는 현상 방지)
- Sequence Number, Ack Number를 통한 신뢰성 보장
- 연결의 설정(3-way handshaking)과 해제(4-way handshaking)
- Error Detection (체크섬=checksum을 통해 검출)
- UDP보다 전송속도가 느리다.
TCP 헤더 붙이기
TCP 프로토콜(in Transport Layer)에서는 상위 Layer의 데이터를 잘게 자른다.
잘려진 각각의 데이터에 TCP Header를 붙이는데 이렇게 만들어진 단위를 세그먼트라고 한다!
TCP Header
아래는 추가된 TCP Header의 실제 모습이다.
중요 개념
- Sourse/Destination Port Number: Transport Layer는 전송을 할 때, port번호를 보고 전송을 하기 때문에 가장 중요한 port번호를 먼저 확인할 수 있다. (각 16비트)
- Sequence Number: 바이트단위로 구분되는 순서화되는 번호다. ⇒ TCP에서 신뢰성과 흐름제어 기능을 제공할 수 있는 것이다. (총 32비트 = 4바이트)
- 임의값으로 순서화된 일렬번호를 붙인다. 32비트 이므로, 최대 4GB(2^32) 크기의 송신 데이터에 순서화된 일련번호를 붙일 수 있다. 최대값 이후에는 0으로 시작한다.
- 쉽게 말해서, 순차 전송의 신뢰성을 보장하는 순서화된 번호이다.
- Acknowledgement number: 수신하기를 기대하는 다음 바이트 번호이다.
- 아래 그림에서 발신자쪽에서 수신하기를 기대하는 승인번호(j + 21)를 나타낸다.
- 6개의 플래그 비트(Flag bits, SYN, ACK, FIN, URG, PSH, PST): TCP 세그먼트를 전달할 때, TCP 데이터 회선과 관리 제어 기능을 하는 플래그다. ⇒ 회선을 위한 TCP 3-way handshake에 쓰인다.
회선이란 신호가 전달될 수 있도록 두 지점 이상이 연결된 경로를 의미한다.
TCP 3-way handshake
: TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이, 데이터를 전송하기 전에
먼저 정확한 전송을 보장하기 위해 네트워크 연결을 설정(Connection Establish) 하는 과정
“네트워크 연결을 설정”이라는 말은 쉽게 말해서 연결 통로를 맺는 과정이라 생각하면 이해하기 쉽다
특징
- TCP Header에 표시된 플래그(=컨트롤 비트) 중 SYN, ACK 플래그가 사용된다.
- 서로의 통신을 위한 관문(port)을 확인하고 연결하기 위하여 3번의 요청/응답 후에 연결이 된다.
- 이 과정에서 가장 많은 시간이 소요되어 UDP방식보다 속도가 느려지는 주요 원인으로 지목된다.
TCP의 3-way handshake := Connection 연결
- 3-way-handshaking에서는 SYN, ACK 플래그가 사용된다.
- 참고) SYN은 'synchronize sequence numbers', 그리고 ACK는'acknowledgment' 의 약자이다.
- 클라이언트: SYN 비트를 1로 설정해서, 패킷을 송신한다. (서버에게 Connection 연결 요청 전달)
- 서버: SYN, ACK 비트를 1로 설정해서, 패킷을 송신한다. (서버에서 정상적으로 패킷을 받았다는 응답 전달)
- TCP는 양방향이기 때문에 서버에서는 Client도 포트를 열어달라는 SYN 을 같이 보낸다.
- 서버에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받은 뒤, SYN_RCV 상태로 변경된다.
- 클라이언트: ACK 비트를 1로 설정해서 패킷을 송신한다.
- 클라이언트에서는 SYN+ACK를 받고, ESTABLISHED로 상태를 변경한다.
- 서버에서도 ACK를 받아서, ESTABLISHED로 상태를 변경된다.
위 세 과정을 정상적으로 거치면, 서로의 포트가 ESTABLISHED(각 State)가 되면서 Connection 연결(연결 통로 완성)됨을 의미한다!
참고) 이 때의 패킷은 Transport Layer의 TCP protocol 하 에서 송수신되는 패킷을 의미한다.
TCP의 데이터 전송 방식
3-way handshake을 통해 양방향으로 Connection이 연결이 되었다면, 이 Connection(연결 통로)에 데이터를 송수신을 할 차례이다.
- 클라이언트: 패킷을 송신 / 이후, 클라이언트는 ACK 수신 대기 (
ACK님 오세요..) - 서버: ACK 송신 (클라이언트야, 패킷 잘 받았다)
만약, 클라이언트가 ACK를 특정 시간내에 수신하지 못하면 패킷을 재송신한다.
4-way-handshaking
: 논리적인 접속 상태를 "해제"하기 위한 과정
쉽게 말해서, HTTP의 요청과 응답과정이 끝나면, 클라이언트가 더이상 보낼 데이터가 없기 때문에 연결을 끊어주는 과정이라 생각하면 쉽다
특징
- TCP 컨트롤 비트 중 SYN, ACK 플래그가 사용된다.
- 해당 과정을 정상적으로 거치면, sever, client는 tcp 연결이 해제되며 연결을 위해 사용한 리소스의 정리가 일어나게 된다.
4-way-handshake := Connection close
- 클라이언트가 SYN 비트를 1로 설정해서, 패킷을 송신한다 (연결 종료하겠다)
- 서버가 ACK 비트를 1로 설정해서, 패킷을 송신
- 서버가 남은 패킷 송신 (일정 시간 대기)
- 서버가 남은 패킷을 모두 송신 후, FIN 비트를 1로 설정해서, 패킷을 송신
- 클라이언트가 ACK 비트를 1로 설정해서, 패킷을 송신 (연결 종료 완료)
문제점 발생 (:= TIME_WAIT의 필요성)
위 3번 과정에서 서버가 남은 패킷을 송신 후, FIN 플래그를 보내기까지의 과정에서 한 가지 문제가 발생할 수 있다.
→ 서버가 FIN을 보내기 전에, 보냈던 데이터가 FIN 보다 늦게 도착할 경우, 클라이언트가 서버로부터 FIN을 수신했다고 클라이언트가 바로 연결된 소켓을 닫아버리면, FIN을 보내기 전에 보냈던 패킷은 영영 클라이언트가 받을 수 없게 된다.
따라서, 클라이언트는 서버로부터 FIN 요청을 받더라도, 일정시간 동안 소켓을 닫지 않고 혹시나 도착하지 않은 잉여 패킷을 기다린다.(=그 때의 상태를 TIME_WAIT State라고 한다.)
TCP의 문제점
1. 전송의 신뢰성은 보장하더라도, 매번 Connection을 연결해서 시간 손실이 발생한다
ex) 3-way handshake
2. 패킷을 조금만 손실해도 무조건 재전송해야 한다.
ex) 눈으로 봤을 때는 큰 차이가 없는 이미지를 또 다시 전송해야 할 때라고 생각하면 쉽다
UDP
: TCP보다 신뢰성이 떨어지지만, 전송 속도가 일반적으로 빠른 프로토콜
특징
- Connectionless (단방향이다. / 3-way handshake X)
- 순차 전송 x
- 흐름 제어 x, 혼잡 제어 x
- Error Detection (체크섬=checksum을 통해 검출)
- 비교적 데이터의 신뢰성이 중요하지 않을 때 사용한다 (주로, 영상 스트리밍에 주로 사용한다.)
UDP 헤더 붙이기
UDP 프로토콜에서는 TCP 프로토콜과 달리 상위 Layer의 데이터를 자르지 않는다.
상위 Layer 데이터 그대로 UDP Header를 붙이는데, 이렇게 만들어진 단위를 “User Datagram”라고 한다!
때문에 향후 User Datagram으로 구현을 할 때가 있다면, 직접 애플리케이션 단에서 잘게 짤라줘야한다.
UDP Header
아래는 추가된 UDP Header의 실제 모습이다.
- Source / Destination port: 전송을 위한 port 번호 (각 16비트)
- Checksum: 에러 검출 (16비트)
UDP 데이터 전송 방식
- Client가 패킷 송신서버는 단지 UDP 관련한 소켓을 열어두고 있다.
- 때문에 데이터 손실이 있을 수 있다.
- (별도 확인도 안하고 보내고 싶을 때 수신자에게 데이터를 보낸다(단방향))
참고
https://www.youtube.com/watch?v=ikDVGYp5dhg
https://en.wikipedia.org/wiki/User_Datagram_Protocol
http://www.ktword.co.kr/test/view/view.php?m_temp1=1889
https://coding-factory.tistory.com/614
https://sjlim5092.tistory.com/37
https://www.saturnsoft.net/network/2019/03/21/quic-http3-1/
https://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake
'OS' 카테고리의 다른 글
OSI 7 Layer (0) | 2023.07.22 |
---|---|
여러 대의 컴퓨터가 통신하려면?? feat.Router (0) | 2023.07.20 |
TCP/IP (0) | 2023.07.16 |
Process Thread (0) | 2023.07.12 |
OS 메모리 관리 (0) | 2023.07.04 |