지난 포스팅에서 OSI의 7 계층에 대해 간략히 적어 보았다. 그중 4 계층에 해당하는 Transport Layer에서는 TCP 프로토콜과 UDP프로토콜을 통해 데이터를 전송하는 역할을 한다. 그중 TCP 프로토콜은 흐름 제어, 순서 제어, 연결 제어, 중복검사를 하여 데이터를 순차적으로 안전하게 전달할 수 있도록 보장한다.
TCP와 UDP가 서버와 동작하는 과정을 살펴보고 차이점을 알아보도록 하자.
데이터 송·수신의 전반적인 과정
호스트 간(peer to peer / client to server)에 데이터를 송·수신하기 위해 각 Layer를 거치며 만들어지는 데이터가 감싸지는 모습이다.
- L4에서 송신자는 소켓을 통해 스트림 형식으로 데이터를 기록한다.
- L3에서 MSS(Minimum Segment Size)의 크기로 소켓의 데이터를 일정 크기로 자르고 TCP 헤더 정보를 넣어 Segment화 시킨다.
- Segment에 IP 헤더 정보(IP 버전, 자신의 IP 주소, 목적지의 IP 주소)를 넣어 Packet화 시킨다.
- Packet에 Frame 헤더 정보(MAC 주소)를 넣어 인터넷으로 보낸다.
- 라우터에서는 L1, L2의 IP 정보까지 만을 확인 후 다시 패킷화 하여 수신자의 위치까지 전달한다.
- 수신자의 PC에서는 L1부터 각 Layer에서 Decapsulation을 하며 해당 프로세스까지 이동한다.
Transport Layer
해당 레이어에서는 Port번호를 파악 후 목적지의 해당 프로세스까지 갈 수 있도록 Switching 역할을 하며 데이터의 전송 단위는 Segment이다. 여기서 주로 사용하는 프로토콜은 TCP와 UDP이며 TCP의 경우 상호 간에 양방향 통신을 하며 다음과 같은 기능을 제공한다.
1. 흐름 제어(Flow Control) : 송신 측과 수신 측의 데이터 처리 속도 차를 해결하기 위한 방법으로 TCP Header에 Window Size정보와 받았다는 신호로 ACK 신호를 같이 보냄으로써 상호 간의 소통으로 데이터의 처리 속도를 제어한다. 응답을 받고 나서야 데이터를 전달하기 때문에 비효율적이다.
- stop and wait 기법 : ACK 신호를 받으면 그때 데이터 전송
- sliding window 기법 : stop and wait의 단점을 해결하기 위해 수신 측에서 설정한 Window Size 만큼 ACK 응답 없이 전송할 수 있게 하여 데이터의 흐름을 동적으로 조절
2. 순서 제어 : 데이터 순서를 맞추기 위해 Sequence Number를 같이 보내어 데이터가 올바른 순서로 조립될 수 있도록 보장
3. 연결 제어 : SYN, ACK, FIN 플래그를 통해 연결을 제어
4. 중복검사 : Checksum으로 데이터의 무결성을 유지
TCP(Transfer Control Protocol)
TCP Header
- Source, Destination Port : 포트의 정보를 담는 데이터의 크기는 각 2^16으로(1~65535, 0과 65536은 포트번호로 쓰지 않는다.) 송신 측 포트와 수신 측 포트의 정보를 기록한다.
- Sequence Number : 신뢰성 및 흐름을 제어하기 위해 데이터의 순서를 기록하고, 수신 측에서는 이것을 보고 데이터를 조립한다.
- Acknowledge Number : 데이터를 받은 수신자가 다음 데이터를 받기 위해 기록하는 Segment 데이터 번호로 다음 데이터는 Segment 번호부터 전송이 된다.
- Checksum : 데이터의 무결성을 확인하기 위해 필요한 정보. checksum을 통해 데이터가 정상인지 비정상인지를 파악
- Window Size : 흐름 제어를 위해 송신자에게 자신의 버퍼 크기를 알려 받을 수 있는 데이터의 크기를 지속적으로 알린다.
- Flag
- URG : 송신 측에서 URG에 값을 세팅하고 넘기면 해당 데이터는 우선순위를 무시하고 먼저 송신된다.
- ACK : SYN 응답을 받고 연결을 허락한다는 의미로 사용
- SYN : 연결 설정을 하기 위해 사용
- FIN : 연결 종료를 요청하기 위해 사용
1. TCP의 연결 단계(3 Way Handshaking)
SYN - SYN+ACK - ACK
1. Client의 연결 요청 SYN 플래그와 SEQ 번호를 넣어 연결을 요청한다.
2. Server의 응답 확인 메시지로 자신의 SEQ 번호와 SYN 요청에서 받은 SEQ에 +1을 하여 다음 데이터 번호를 ACK에 저장하여 보낸다.
3. Client는 Server의 연결 허락 메시지를 받고 다음 SEQ 번호와 ACK 번호를 넣어 연결 설정을 완료한다.
2. TCP 데이터 전송 단계
데이터의 전송이 시작되며 Window Size(여기서는 100으로 가정) 크기의 데이터와 SEQ번호를 전송하며 송신하고, 다음 ACK 값으로 받은 SEQ 값+ 데이터의 크기 +1의 값을 보내며 받았다는 신호를 보내고 서버는 이를 토대로 다음 데이터를 전송한다. 만약 데이터를 보내고 나서 수신자의 ACK 메시지가 오지 않았다면 재전송을 하여 데이터가 보존될 수 있도록 한다.
3. TCP 연결 종료 단계(4 Way Handshaking)
FIN - ACK - FIN - ACK
1. Client의 종료 요청을 보낸다.
2. Server는 Client 메시지를 받았다는 ACK 신호를 보낸다.
3. 처리되지 못한 데이터가 있으면 마저 Client에게 보낸 후 FIN 신호를 보내 종료를 허락한다는 메시지를 보낸다.
4. Client는 Server의 메시지에 응답하고 연결을 종료한다.
TCP 특징 및 단점
- 양방향 통신을 하며 신뢰성 있는 데이터 통신을 한다.
- ACK 신호를 보내며 서로의 메시지에 대해 확인의 메시지를 다시 보내서 신뢰도를 높임
- ACK 신호를 받지 못했다면 다시 메시지를 보내어 데이터 손실을 막아 안전성을 확보한다.
- SEQ 값으로 순차 전송을 보장한다.
- 매번 서로의 메시지를 확인하며 통신하다 보니 비효율적이다.
- 보낸 데이터의 극히 일부가 이상하더라도 다시 전송하여 데이터의 안전성을 보장하지만 역시 비효율적이다.
UDP(User Datagram Protocol)
UDP의 경우 단방향 통신으로 연결을 위한 통신을 하지 않고, 별도의 SEQ, ACK와 같은 메시지를 전달하지 않는다. 따라서 TCP보다 전송속도가 빠르지만 신뢰성은 보장하지 못한다.(순차 전송 X, 흐름 제어 X, 혼잡 제어 X) 즉, 데이터의 안전 문제보다 성능을 더 중요하게 생각할 때 사용하며 영상 스트리밍에 많이 사용된다.
특징
- 비연결형 프로토콜
- 혼잡 제어 X
- 흐름 제어 X
- 순서 제어 X
- 신속성
- 데이터 전송 단위는 Datagram이다
- 일 대 일 통신뿐만 아니라 멀티캐스트(다 대 다), 브로드 캐스트(일 대 다) 통신 지원
참고하면 좋은 사이트
'CS > Network' 카테고리의 다른 글
HTTP와 HTTPS (0) | 2022.09.16 |
---|---|
CDN이란 무엇일까? (0) | 2022.09.06 |
클라이언트의 서비스 요청에 따른 서버의 처리과정 (0) | 2022.09.01 |
Proxy 프록시 (0) | 2022.05.16 |
Web에서의 인증과 인가(세션과 토큰) (0) | 2021.12.29 |