(네트워크) TCP/IP 흐름제어와 혼잡제어

HEYDAY7·2022년 12월 7일
0

서버 관련 Background

목록 보기
8/10

TCP

Transmission Control Protocol의 약자로, 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 프로토콜의 일종이다. OSI모형에서 L4인 Transport Layer에서 사용하는 규약이며, "가상회선 패킷 교환 방식"을 통해 통신을 한다.

TCP 3-way handshake

TCP는 연결지향 프로토콜로 신뢰성 확보를 위해 통신 전 먼저 3-way handshake를 한다. 구조는 다음과 같다.
클라이언트와 서버가 있다고 하자.(클라이언트와 서버의 분류는 먼저 요청하는 쪽이 클라이언트라고 해두자)
1. 클라이언트가 서버에 SYN 패킷을 보낸다. 이때 client의 ISN을 담아 보낸다.
2. 서버에서는 이를 확인하고 응답 ACK와 SYN 패킷을 클라이언트로 보낸다. 이때 승인 번호로 ISN + 1을 보낸다.
3. 클라이언트에서 받은 패킷에 대한 응답으로 ACK를 보내고 ESTABLISHED 상태가 된다.
4. 서버는 이 패킷을 받고 ESTABLISHED 상태가 된다.

이렇게 양 쪽이 모두 ESTABLISHED 상태가 되면 서로 신뢰성 있는 연결을 맺게 된 것이다.

TCP 4-way handshake

3-way handshake와 반대로 연결을 종료할때는 4-way handshake 과정이 발생한다.
1. 클라이언트가 서버에 FIN으로 설정된 세그먼트를 보내고, FIN_WAIT_1 상태가 된다.
2. 서버는 이를 받아 확인했다는 ACK 세그먼트를 보내고, CLOSE_WAIT 상태가 된다. 클라이언트는 해당 응답 세그먼트를 받고 FIN_WAIT_2가 된다.
3. 이후 서버가 통신을 끝내고 연결을 종료할 준비가 되면 클라이언트에 FIN 세그먼트를 보낸다.
4. 이를 받은 클리이언트는 TIME_WAIT 상태가 되고, 서버에 ACK를 보내 서버는 CLOSED 상태가 된다.
5. 클라이언트는 일정시간 동안 유지되다 CLOSE 상태로 전환되며 연결이 끝난다.

  • TIME_WAIT : 그냥 연결을 끊지 않고 일정 시간을 남겨두는 것이다. 그 이유는 지연 패킷이 발생할 경우를 대비하기 위해서이다. 패킷이 모종의 이유로 뒤늦게 도착했는데, 이를 처리하지 못하게 되면 데이터 무결성 문제가 발생할 수 있기에 안전장치의 용도로 바로 연결을 닫지않고 짧은 시간동안 유지합니다.

TCP/IP

위에서 TCP에 대해 알아보았다. 그렇다면 왜 TCP/IP를 묶어서 칭하는 것일까? 이 두 프로토콜을 묶어서 자주 사용하기 때문이다. IP의 역할은 전달하고자 하는 목적지의 주소를 보고 그 경로를 정한고 올바르게 향하게 한다. 다만 이 IP는 전송의 책임을 지지 않는다. 즉 상대방이 제대로 받았는지에 대한 보장을 해주지 않는 비연결형적인 특징을 가지고 있다. !여기서 TCP가 등장한다. 위에서 알아봤듯이 TCP는 3-way handshake를 이용하며 연결지향 프로토콜로 메시지가 잘 도착했는지를 관리해줄 수 있다. 따라서 TCP와 IP를 같이 사용하는 것으로 IP의 단점을 상쇄할 수 있는 것이다.

흐름 제어

TCP/IP가 제공하는 기능(?) 중 송신측과 수신측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하는 기법이다.

stop and wait

하나씩~ 하나씩 주고받으며 처리 하는 방식이다. 매우 비효율적이다.

sliding window

어디서 많이 봐본 window를 사용하는 방식이다. window size의 경우에는 처리할 수 있는 패킷(세그먼트)의 양을 말하며 최초 window size의 경우 수신자 쪽에서 3-way handshake 과정 중에 정하게 된다. 이 window size를 통해서 송신자는 자신이 얼마까지 더 보내도 되는지를 파악하고, 수신자는 ACK에 처리가 가능한 만큼의 window size를 담아 보내 window size를 갱신시키는 것이다.

혼잡 제어

혼잡 제어의 경우 양 엔드포인트(송/수신자) 말고 그 데이터가 지나가는 네트워크 망의 혼잡도를 제어하는 기법이다. 예로 라우터가 처리할 수 있는 양을 초과하면 라우터는 데이터를 더이상 처리할 수 없고, 응답을 받지 못한 송신측은 손실이라 판단하여 계속해서 데이터를 전송하면 네트워크가 아주 혼잡해진다.

AIMD

Additive Increase & Multicative Decrease.
처음엔 패킷을 하나씩만 보내고, 문제가 없으면 window size를 증가시켜 간다. 전송이 실패할 경우 window size를 절반으로 줄인다. 이 방법의 경우 초기에 window size가 늘어나는데 너무 오랜 시간이 걸려 최고의 성능을 내기까지 시간이 걸린다.

Slow start

window size를 지수적으로 증가시키며, 혼잡이 감지되면 1로 줄인다. 수신쪽에서 보낸 ACK가 도착할때마다 증가시키기에 가면 갈수록 증가가 빨라진다.

Fast Retransmit

이 방법은 패킷을 재전송 하는 기법이다. 수신 측에서 먼저 보낸 패킷이 도착하지 않았는데 다음 패킷이 도착할 경우 도착했어야 하는 패킷의 순서를 담에 ACK를 보내준다. 송신측에서 해당 ACK를 3번 감지하면 문제가 되는 패킷을 재전송해준다. 이를 통해 송신측에서 설장한 응답 timeout이 되기 전에 패킷을 재전송 할 수 있게 된다.

Fast Recovery

혼잡상태가 되면 window size를 반으로 줄인 후 선형적으로 증가시킴. 혼잡 후에 AIMD와 같은 방식으로 동작

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글