IP에서 사용 중인 패킷 교환 방식은 송신자가 수신자에게 보낼 데이터를 분할하여 패킷 형태로 송신한다. 이때 수신자는 여러 송신자로부터 패킷을 받게된다. 이때 네트워크의 상황에 따라 패킷의 순서가 달라지거나 전송되지 않을 수도 있다. 따라서 TCP에서 패킷이 흐름대로 수신자에게 전달될 수 있도록 도와준다.
결론적으로 IP는 패킷을 목적지까지 전달하는 것에만 집중을 하고 TCP는 패킷의 흐름을 관리하여 신뢰성을 확보한다. 그렇다면 IP와 TCP가 어떻게 동작하는지 자세히 알아보자.
TCP의 동작과정
DNS에서 IP주소를 받아온 이후에 서버에 바로 데이터를 전송하지 않는다. 먼저 서버의 상태를 확인해야한다. 현재 서버가 나의 데이터를 받을 수 있는지 확인한 후에 데이터 전송이 이루어져야한다. 이를 위해 TCP는 3-way handshake를 사용한다.
먼저 클라이언트는 데이터를 보내도되는지 확인하기위해 "SYN"을 전송한다. 서버에서 데이터를 "SYN"를 받고 데이터를 보내도 된다면 "ACK"를 클라이언트에 전달하여 클라이언트가 보낸 데이터를 잘 받았다고 말합니다. 이후 클라이언트는 다시 서버에 "ACK"를 보내며 데이터를 보낼 준비를 합니다.
TCP로 이루어지는 통신들은 위의 과정을 통해 전송을 준비한다. TCP는 패킷의 흐름을 제어한다고 했다. 이를 위해서는 패킷에 TCP헤더를 부가하여 이를 참고하여 흐름을 제어한다. 다음은 TCP 헤더에 포함된 필드들이다.
송신처 포트 번호 | 패킷을 송신한 측의 포트번호 |
수신처 포트 번호 | 패킷을 수신하는 측의 포트번호 |
시퀀스 번호 | 송신 데이터의 일련 번호로 현재 전달하는 패킷이 몇 번째 바이트에 해당하는지를 포함 |
ACK 번호 | 데이터가 몇 바이트까지 수신측에 도착했는지 수신측에서 송신측에 전달 |
데이터 오프셋 | 헤더의 길이를 나타내며 데이터의 시작위치를 알 수 있음 |
컨트롤 비트 | ACK, SYN, RST, FIN 등으로 제어를 한다. |
Window | 수신측에서 송신측에 송신할 수 있는 데이터의 양을 알림 |
체크섬 | 오류 검사 |
긴급 포인터 | 긴급하게 처리해야하는 데이터의 위치 |
옵션 |
위의 TCP 헤더를 파악하면 어느정도 TCP의 동작을 유추할 수 있다. 그렇다면 위의 헤더를 참고하여 TCP가 어떻게 흐름을 제어하는지 알아보자.
흐름을 제어하기위해서 헤더 내의 시퀀스 번호, ACK 번호, Window를 사용할 수 있다. 먼저 패킷의 순서를 나타내는 시퀀스 번호를 통해 따로따로 보내는 패킷을 다시 하나의 데이터로 합칠 수 있으며 ACK번호는 지금까지 받은 데이터에 대한 번호를 송신측에 전달하여 송신측이 어떤 데이터를 보내야하는지 알 수 있도록 한다. 또한 매번 받은 데이터에 대한 ACK를 보내면 네트워크가 복잡해질 수 있기 때문에 송신측에서 ACK를 기다리지않고 보낼 수 있는 패킷의 양을 Window 필드에 기술하여 송신측에 보낸다. 이는 수신측에서 처리할 수 있는 양이 된다.
위의 과정을 통해 TCP는 네트워크 상에서 패킷의 흐름을 제어할 수 있다. 두 번째로 TCP는 혼잡 제어를 합니다. 인터넷에서는 무수히 많은 패킷의 흐름이 있다. 클라이언트는 패킷을 빠르게 전달하기위해 정해진 시간 내에 전달할 수 있는 최대의 패킷을 보내었고 정상적으로 도착하지 않았을 때는 다시 보내게되어 네트워크가 혼잡했다.
따라서 혼잡 제어를 위해 다양한 방법이 존재한다. 위키 백과에 따르면 합 증가/곱 감소, 느린 시작 등이 있다. 간단하게 말하면 합 증가/곱 감소는 패킷을 하나씩 보내다가 아무 이상이 없을 때 패킷의 수를 1씩 증가하고 문제가 발생했을 때는 현재 전달하는 패킷의 수를 반으로 줄여서 잔달한다.
느린 시작은 처음에 패킷을 하나씩 보내다가 문제가 없을 때 ACK 패킷마다 Window 크기를 1씩 늘려 한 주기가 돌았을 때 Window 크기가 2배가 된다. 혼잡 현상이 발생하면 지금까지의 Window 사이즈의 절반까지로 전달하게 된다.
IP의 동작과정
IP는 패킷 교환 방식을 통해 데이터를 주고받는다. TCP가 패킷의 흐름과 혼잡을 제어했다면 IP는 목적지까지 반드시 도착할 수 있도록 동작하며 신뢰성을 확보한다.
패킷은 라우터를 통해 목적지까지 패킷을 전송한다. 라우터는 서로 다른 네트워크를 연결하며 라우팅 테이블을 통해 목적지까지 가는데 최적의 경로로 갈 수 있도록 한다. 이후에 라우터에 대해 자세히 알아보자.
참고
https://aws-hyoh.tistory.com/57#comment8608372
'CS > 네트워크' 카테고리의 다른 글
[네트워크] 서버의 부하를 분산하는 방법 (0) | 2021.07.20 |
---|---|
[네트워크] 방화벽의 동작원리 (0) | 2021.07.19 |
[네트워크] 네트워크 장비 (0) | 2021.07.12 |
[네트워크] DNS (0) | 2021.07.07 |
[네트워크] HTTP (0) | 2021.07.07 |