TCP.
#1 Summary.
앞에서 UDP에 대해서 알아봤고 이번에는 TCP에 대해 알아보겠다. 누누히 말하지만 같이 공부하는 입장이기에 이미 다 알고 계신 개념이면 복습 정도로 읽어주시고 아니면 안 보셔도 된다.
CF) UDP 관련 글 ==> http://allblackk.tistory.com/335?category=759372
CF2) IP 관련 글 ==> http://allblackk.tistory.com/337
#2 TCP.
TCP(Transmission Control Protocol)은 단어 뜻대로 전송을 제어하는 프로토콜,규약이라는 뜻이다. 이것보다는 인터넷에서 데이터를 메시지 형태로 보내기 위해 IP와 함께 사용하는 프로토콜이라고 알아두는 게 더 좋을 거 같다. 보통 TCP와 IP를 함께 사용하는데 IP가 데이터의 전송을 처리한다면 TCP는 패킷을 추적하고 관리하게 된다. TCP는 연결형 서비스를 지원하는 프로토콜로 인터넷 환경에서 기본으로 사용한다. 곧 언급할 OSI 7 Layer에서 트랜스포트,즉 4계층에 해당한다. 호스트 내 프로세스 상호 간에 신뢰적인 연결지향성 서비스를 제공한다. IP의 비신뢰적인 서비스에다가 신뢰적인 연결지향성 서비스를 제공한다. 이 말은 즉슨 신뢰적인 전송을 보장함으로써 애플리케이션 구현이 좀 더 쉬워지게 된다. 한 마디로 엄청 많은 일을 하는 꽤나 복잡한 프로토콜이라고 할 수 있다.
#2-1 Virtual Circuit Packet Switching
데이터를 전송하기 전에 논리적인 연결이 설정되는데 이를 가상 회선(Virtual Circuit)이라고 하고 연결 지향형 서비스를 의미한다. 각 패킷에서는 가상 회선 식별 번호(VCI)가 포함되고, 모든 패킷을 전송하면 가상 회선이 해제되고 패킷들은 전송된 순서대로 도착한다. 데이터그램 방식에서는 패킷마다 라우터가 경로를 선택하지만 가상 회선 방식은 경로를 설정할 때 한 번만 수행한다. 즉 유한한 시간 안이나 다량의 데이터를 연속으로 보낼 때는 가상 회선(Virtual Circuit) 방식이 좋고 짧은 메시지의 일시적인 전송에는 데이터그램(DataGram) 방식이 좋다. 또한 네트워크 내의 한 노드가 다운되면 데이터그램 방식은 다른 경로를 또 다시 새로 설정하지만, 가상 회선 방식은 그 노드를 지나는 모든 가상 회선을 잃게 된다.
#3 TCP's Feature.
#3-1 연결형 서비스를 지원하는 전송 계층 프로토콜이다.
#3-2 호스트 간에 신뢰성이 있는 데이터 전달,흐름 제어 및 혼잡 제어를 제공한다.
#3-3 승인 받지 않은 패킷을 인식하고 자동으로 재전송하는 슬라이딩 윈도우 시스템으로 관리한다.
#3-4 1:1, 즉 유니캐스트 통신.
#3-5 3-Way HandShaking 과정을 통해 연결을 설정하고 4-Way HandShaking을 통해 해제한다.
#3-6 UDP보다 속도가 느린 대신에 높은 신뢰성을 보장한다.
TCP가 가상 회선 방식을 제공한다는 것은 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정한다는 말이다. 그리고 3-way handshaking과정은 목적지와 수신지를 확실히 하여 정확한 전송을 보장하기 위해서세션을 수립하는 과정을 의미한다. TCP는 연결형 서비스로 신뢰성을 보장하기 때문이다. 그래서 3-way handshaking의 과정도 사용하는 것이고, 데이터의 흐름제어나 혼잡 제어와 같은 기능도 한다. 하지만 이러한 기능 때문에 UDP보다 속도가 느리게 된다. 즉 TCP는 연속성보다 신뢰성 있는 전송이 중요할 때에 사용하는 프로토콜이다.
#4 TCP Header.
#4-1 Source Port(16Bit) ==> 출발지 포트 번호를 의미한다. 응용 서비스에 따라 포트 번호가 정해져 있는 경우도 종종 있지만, 대부분은 처음 세그먼트를 보내는 측에서 임의의 번호를 사용한다.
#4-2 Destination Port(16Bit) ==> 목적지 포트 번호를 의미한다. 응용 서비스에 따라 포트 번호가 이미 정해져 있다.
#4-3 Sequence Number(32Bit) ==> TCP에서는 데이터를 보낼때 마다 각 데이터에 고유한 번호를 부여해서 전송을 시도한다. 방금 말한 고유한 번호가 Sequence Number다.
#4-4 Acknowledgment Number(32Bit) ==> 상대방이 보낸 세그먼트를 잘 받았다는 것을 알려주기 위한 번호다.
#4-5 Data Offset(4Bit) ==> TCP 헤더 길이를 4Byte 단위로 표시한다. TCP 헤더 길이는 최소 20에서 최대 60Byte이다.
#4-6 Reserved(4Bit) ==> 사용하지 않는 필드이고 모두 0으로 표시한다.
#4-7 Flag(8Bit) ==> CWR, ECE, URG, ACK, PSH, RST, SYN, FIN를 전부 Flag에 속해 있으며 제어 비트(Control Bits)라고도 불린다. 세그먼트의 종류를 표시하는 필드라고 할 수 있다.
#4-8 Window Size(16Bit) ==> 송,수신 가능한 데이터의 사이즈, 즉 상대방의 확인 없이 전송할 수 있는 최대 바이트 수를 표시한다.
#4-9 CheckSum(16Bit) ==> 헤더와 데이터의 에러를 확인하기 위한 필드다. TCP의 체크섬은 TCP 헤더만 가지고 계산한다.
#4-10 Urgent Pointer(16Bit) ==> 현재 순서 번호부터 긴급 포인트(Urgent Pointer)에 표시된 바이트까지가 긴급한 데이터라고 표시한다. URG 플래그가 활성화 되어 있지 않은 상태면 사용되지 않는 필드다. 20Byte를 채우기 위해서 0으로 값을 채운다.
#4-11 Options(0 ~ 40 Byte) ==> 최대 세그먼트 사이즈 지정 등 추가적인 옵션이 있을 경우 표시한다.
#4-12 Padding ==> 32Bit 크기를 채우기 위해서 사용된다.
CF) 필드(Field) ==> 특정 목적을 가진 레코드나 메시지 헤더 or PC 명령어와 같은 데이터 단위 내의 고정된 장소를 말하는데, 그 길이는 미리 정해져 있다.
CF) 레코드(Record) ==> 정보 or 개념의 단위이고 하나의 객체는 여러 개의 속성을 가진다.
#5 TCP Header Flag.
위의 그림에서 검은색 원 안에 있는 Flag에 대해 하나하나 살펴보도록 하겠다. 8개의 플래그에 대해 언급은 하겠지만 빨간색 직사각형 안에 있는 6개만 알면 된다.
#5-1 CWR(Congestion Window Reduced) ==> 받는 사람의 버퍼의 상태를 보내는 사람에게 알려 보내는 윈도우의 사이즈를 줄이기 위해 사용된다.
#5-2 ECE(ECN-Echo) ==>네트워크의 혼잡 가능성을 미리 탐지하여 이를 보내는 측에 알려 전송 속도를 조절할 때 사용된다.
#5-3 URG(Urgent) ==> 단어 뜻 그대로 보통 보이지 않는 비트이며 긴급한 상황이 발생했을 경우에만 사용된다.
#5-4 ACK(Acknowledgment) ==> 데이터가 정상적으로 전송되었음을 알리는 비트다. 즉 접속에 응답했을 때 사용된다.
#5-5 PSH(Push) ==> 데이터를 빨리 보내고자 할 경우에 사용된다. 시간이 중요하고 대부분 사용자 중심의 애플리케이션일 경우 PSH 플래그를 설정한다.
#5-6 RST(Reset) ==> RST 비트를 설정하면 TCP 패킷은 TCP 연결을 재설정한다. 예를 들어 애플리케이션이 종료가 되었어도 RST를 보내지 않은 경우 TCP 연결은 종료가 되지 않고 그대로 유지된다. 애플리케이션에서 오류가 발생할 경우 통신 과정 중간에 RST를 전송해서 TCP 연결을 재설정할 수 있다.
#5-7 SYN(Synchronize Sequence Numbers) ==> SYN 비트는 위에서 언급했던 3-Way HandShaking 과정을 할 때 사용되며, 3-Way HandShaking 과정의 1번째 2개의 패킷에서 설정한다. 쉽게 말해 접속을 요청할 때 사용된다.
#5-8 FIN(Finish) ==> Finish 비트는 말 그대로 데이터 전송이 완료되어서 현제 세션을 종료할 때 사용한다.
#6 TCP/IP Protocol Stack.
[출처:http://simplesolace.tistory.com]
일단 IP랑 TCP가 관련성이 있기에 TCP 관련 글이기는 하지만 따로 떨어져 있는 개념이 아니기에 설명해보겠다. 아직 언급 안 한 개념들도 있기에 이해가 100% 안 될 수도 있지만 결국은 다 알아야 되기 때문에 이런 개념이 있다 정도로 알면 될 거 같다. TCP/IP 프로토콜 스택은 인터넷 기반의 데이터 주고 받기를 목적으로 설계된 스택이다. 데이터 주고 받기의 과정을 4개의 영역으로 계층화 한 결과다. OSI 7 Layer로 세분화가 되기도 하고 TCP/IP 4 Layer로 나타내기도 한다.
CF) 프로토콜을 계층화시킨 이유는 인터넷을 통한 데이터 주고 받기는 하드웨어 없이 소프트웨어만으로는 가능하지 않다. 결국에는 하드웨어와 소프트웨어의 조화가 필요했고 표준 OSI 7 Layer가 만들어졌고 그걸 4개로 줄인 것이 TCP/IP 4 layer, 즉 TCP/IP 프로토콜 스택이다. 표를 보면 이해가 좀 더 쉬울 것이다. 표에 대한 자세한 설명은 관련 글에서 설명해보도록 하겠다.
CF) 헷갈릴 수 있는데 TCP/IP Model에서 보면 Link Layer와 Network Access Layer는 같은 말이다. TCP/IP Model를 5계층으로 분류한 것도 볼 수 있는데 보편적으로 4계층으로 나누기 때문에 5계층에 대해서는 따로 언급하지는 않겠다.
#6-1 Link 계층 ==> Link 계층은 물리적인 영역의 표준화에 대한 결과이다. 이 계층에서 LAN, WAN, MAN과 같은 프로토콜의 표준을 정의한다.
#6-2 IP 계층 ==> Link 계층에서 물리적인 연결이 되었으니 경로 설정이 필요하다. 경로 설정을 할 때 반드시 필요한 것이 IP 계층이고 당연히 사용하는 프로토콜은 IP다. IP 관련 글에서도 언급했지만 IP는 비연결적이기에 신뢰할 수 없는 프로토콜이다. 즉 매번 설정되는 경로가 다 다르기 때문에 보내는 순서대로 순차적으로 도착하지도 않고 설정된 경로에 오류가 생겨도 크게 문제가 되지 않는다.
#6-3 TCP/UDP 계층 ==> 실제 데이터의 주고 받기랑 관련이 있는 계층이다. 위의 표에서도 알 수 있듯이 전송 계층(Transport Layer)이다. 즉 IP 계층에서 호스트와 호스트가 데이터를 송수신을 하는 것이 TCP/UDP 프로토콜이다. 여기서 알 수 있듯이 TCP는 IP 프로토콜에 신뢰성을 부여한 프로토콜이라는 것을 알 수 있다.
#6-4 Application 계층 ==> 다른 계층들은 모두 자동인데 애플리키케이션 계층은 다르다. 즉 프로그래머에 의해 완성이 되는 계층이고 응용 프로그램의 프로토콜을 구성하는 계층이다. 즉 소켓을 기반으로 완성되는 프로토콜이고 만약에 소켓을 만들면 그 전의 3가지 계층의 내용은 볼 수가 없다.
CF) TCP 전송 방식에 대해서 언급하면 글이 너무 길어질 거 같아서 다른 글에서 언급하도록 하겠다.
#7 TCP Server Client Function Call Relationship.
TCP를 이용해서 서버와 클라이언트의 실행해본다면 구성은 위와 같은 관계도를 가지게 된다. 먼저 서버와 클라이언트 둘 다 소켓을 생성한다. 서버는 bind(), listen()을 호출해서 클라이언트의 요청을 기다리는 대기 상태로 기다리고 있다. 클라이언트는 connect() 함수를 호출해서 서버에 연결 요청을 하게 된다. 서버는 accept() 함수를 통해 클라이언트의 요청을 허가하게 되는데 여기까지의 과정을 통해 서버와 클라이언트는 서로 연결 상태가 된다. 이후에 데이터 입출력 함수인 read(), write()를 통해 데이터를 주고 받으며 마지막으로 close() 함수를 호출해서 연결을 종료한다.
CF) 뭔가 빠진 거 같기는 한데 말하고자 했던 내용들은 말한 거 같고 TCP 서버 클라이언트 동작 방식에 대해서는 다른 글에서 언급하도록 하겠다.
'#NetWork' 카테고리의 다른 글
IPv6 Header. (0) | 2018.08.09 |
---|---|
IPv4 Header. (0) | 2018.08.07 |
NAT. (0) | 2018.08.01 |
IP. (0) | 2018.07.31 |
UDP. (0) | 2018.07.30 |