: TCP (Transmission Control Protocol)는 신뢰성과 순서 보장을 중시하는 연결 지향 프로토콜입니다. TCP는 데이터를 작은 패킷으로 나누어 전송하고, 수신 측에서는 이러한 패킷들을 재조립하여 완전한 데이터로 복구합니다. 이를 위해 각 패킷은 시퀀스 번호를 가지고 있어서 데이터의 순서를 추적할 수 있습니다. 또한, 수신 측에서는 패킷의 손실이나 오류를 감지하고 재전송을 요청할 수 있습니다. TCP는 신뢰성을 보장하기 위해 패킷 전송 확인, 패킷 재전송, 흐름 제어, 혼잡 제어 등의 기능을 제공합니다. 따라서, TCP는 웹 브라우징, 이메일, 파일 전송 등과 같이 신뢰성이 중요한 애플리케이션에서 주로 사용됩니다.
반면에 UDP (User Datagram Protocol)는 신뢰성이 낮지만 빠른 속도가 필요한 경우에 사용되는 비연결 지향 프로토콜입니다. UDP는 패킷을 단순히 보내고 받는 역할만 하며, 추가적인 기능을 제공하지 않습니다. 따라서, 데이터를 전송할 때 패킷의 손실이나 순서 변경이 발생할 수 있으며, 이러한 문제에 대한 보정은 애플리케이션에서 처리해야 합니다. UDP는 실시간 스트리밍, DNS 조회, 오디오/비디오 통화 등에서 주로 사용됩니다. 이러한 애플리케이션에서는 데이터의 신속한 전달이 중요하며, 약간의 패킷 손실이나 지연이 발생해도 문제가 크게 되지 않는 경우가 많습니다.
요약하자면, TCP는 신뢰성과 순서 보장을 중시하는 연결 지향 프로토콜이며, UDP는 신뢰성이 낮지만 빠른 속도가 필요한 비연결 지향 프로토콜입니다. TCP는 패킷의 전송 및 수신 확인, 재전송, 흐름 제어, 혼잡 제어 등의 기능을 제공하지만, UDP는 이러한 기능을 제공하지 않습니다. 따라서, 애플리케이션의 요구에 따라 TCP 또는 UDP를 선택하여 데이터를 전송할 수 있습니다.
TCP 헤더는 TCP 프로토콜의 데이터 전송 과정에서 패킷에 추가되는 정보를 담고 있는 부분입니다. TCP 헤더는 20바이트로 구성되며, 다음과 같은 필드로 구성됩니다:
소스 포트(Source Port)
: 전송하는 응용 프로그램의 포트 번호를 나타냅니다. 이 값은 16비트로 표현되며, 송신 측의 응용 프로그램을 식별합니다.
목적지 포트(Destination Port)
: 수신측 응용 프로그램의 포트 번호를 나타냅니다. 이 값도 16비트로 표현되며, 수신 측의 응용 프로그램을 식별합니다.
시퀀스 번호(Sequence Number)
: TCP 세션에서 전송되는 데이터의 바이트 순서를 나타냅니다. 이 값을 사용하여 수신 측에서 데이터의 순서를 복구할 수 있습니다.
확인 응답 번호(Acknowledgment Number)
: 확인 응답(Acknowledgment)을 위해 사용되며, 수신 측이 다음에 기대하는 바이트를 알려줍니다. 이 값은 수신 측이 받은 데이터의 바이트 수에 1을 더한 값입니다.
헤더 길이(Header Length)
: TCP 헤더의 길이를 4바이트 단위로 표현한 값입니다. 예를 들어, 5는 헤더가 20바이트임을 나타냅니다.
플래그(Flags)
: TCP 통신의 상태와 제어 정보를 나타내는 비트 필드입니다. 주요 플래그로는 URG, ACK, PSH, RST, SYN, FIN 등이 있습니다. 예를 들어, SYN 플래그는 TCP 연결 설정을 시작하고, ACK 플래그는 수신 측으로부터 확인 응답을 나타냅니다.
창 크기(Window Size)
: 송신 측에서 수신 측에게 받을 수 있는 데이터의 양을 나타냅니다. 이 값은 수신 측의 버퍼 크기를 나타내며, 수신 측은 이를 기반으로 송신 측에게 데이터를 전송할 수 있는 윈도우 크기를 알려줍니다.
체크섬(Checksum)
: 데이터의 오류를 검출하기 위한 체크섬 값입니다. 송신 측에서 TCP 헤더와 데이터를 계산하여 체크섬을 생성하고, 수신 측에서는 체크섬을 검사하여 오류 여부를 확인합니다.
긴급 포인터(Urgent Pointer)
: URG 플래그가 설정된 경우, 긴급 데이터의 마지막 바이트 위치를 가리킵니다.
TCP 헤더는 데이터 전송의 제어 정보와 오류 검출을 위한 필수적인 정보를 포함하고 있습니다. 이를 통해 TCP는 신뢰성과 순서 보장을 실현할 수 있습니다.
: MTU는 Maximum Transmission Unit의 약자로, 네트워크 통신에서 한 번에 전송할 수 있는 최대 데이터 패킷 크기를 나타냅니다. MTU는 네트워크 링크(이더넷, Wi-Fi, PPP 등)에서 지원하는 최대 프레임 크기를 의미합니다.
MTU는 일반적으로 바이트 단위로 표현되며, 네트워크 링크의 종류에 따라 다양한 크기가 사용될 수 있습니다. 예를 들어, 이더넷의 MTU는 일반적으로 1500바이트입니다.
MTU의 중요한 역할은 큰 데이터를 작은 패킷으로 분할하여 전송할 때 발생하는 패킷 조각화(fragmentation)를 제어하는 것입니다. 네트워크 링크는 MTU보다 큰 데이터를 전송하기 위해 패킷을 작은 조각으로 분할하고, 수신 측에서는 조각화된 패킷을 재조립하여 원래의 데이터로 복원합니다. 그러나 패킷 조각화는 네트워크 성능을 저하시킬 수 있으므로, 가능한 경우 MTU에 맞는 크기로 데이터를 전송하는 것이 성능을 향상시키는 데 도움이 됩니다.
MTU 크기는 네트워크 트래픽의 효율성과 성능에 영향을 미칠 수 있습니다. 큰 MTU 크기는 대용량 데이터 전송 시간을 줄일 수 있지만, 패킷 손실이나 조각화 문제가 발생할 수 있습니다. 작은 MTU 크기는 패킷 조각화를 줄이고 안정성을 높일 수 있지만, 전송 효율성은 저하될 수 있어, 적절한 MTU 크기를 설정하는 것이 중요합니다.
3-way handshake:
클라이언트(Client)는 서버(Server)에게 연결 요청을 보내기 위해 SYN(Synchronize) 패킷을 전송합니다. 이 패킷은 클라이언트가 서버와의 연결을 설정하고자 함을 나타냅니다.
서버는 클라이언트의 요청을 수신했음을 알리기 위해 SYN-ACK(Synchronize-Acknowledgment) 패킷을 전송합니다. 이
패킷은 서버가 클라이언트의 요청을 받아들였으며, 클라이언트와의 연결 설정을 위한 초기 시퀀스 번호를 포함합니다.
클라이언트는 서버로부터의 응답을 확인하기 위해 ACK(Acknowledgment) 패킷을 전송합니다. 이 패킷은 서버로부터 받은 SYN-ACK 패킷에 대한 확인 응답이며, 서버와 클라이언트 간의 연결이 성공적으로 설정되었음을 나타냅니다.
4-way handshake:
클라이언트 또는 서버 중 한 쪽이 연결 종료를 요청하기 위해 FIN(Finish) 패킷을 전송합니다. 이 패킷은 상대방에게 연결 종료를 요청함을 알리는 역할을 합니다.
상대방은 FIN 패킷을 수신했다는 확인을 위해 ACK 패킷을 전송합니다. 이 패킷은 FIN 패킷에 대한 확인 응답입니다.
연결을 종료할 준비가 되었다는 신호로써, 연결을 종료하기 위해 자원을 정리하고 상태를 유지하는 시간을 대기하는 과정입니다.
정리 및 대기 과정이 완료되면, 상대방에게 FIN 패킷을 전송하여 연결을 종료함을 알립니다. 이에 대한 확인 응답으로 ACK 패킷이 전송됩니다.
이렇게 4-way handshake가 완료되면 클라이언트와 서버 간의 TCP 연결이 종료됩니다. 연결 종료 후에는 더 이상 데이터 전송이 이루어지지 않습니다. 4-way handshake는 양방향 통신이기 때문에 양쪽에서 동시에 종료 요청을 할 수도 있습니다.
3-way handshake는 연결 설정을 위해 3개의 패킷을 주고받는 과정이고, 4-way handshake는 연결 종료를 위해 4개의 패킷을 주고받는 과정입니다. 이러한 핸드셰이크 과정을 통해 TCP는 신뢰성과 순서 보장을 제공하며, 안정적인 연결을 구축하고 종료할 수 있습니다.