TCP 소켓
-
전송 계층 프로토콜의 핵심 기능은 호스트 안에서의 프로세스 식별을 통한 데이터의 배달이라고 볼 수 있다.
-
네트워크를 통해 배달된 데이터가 어떤 프로세스에게 배달된 것인지를 확인한 후 적절한 프로세스에게 전달하는 것이 전송 프로토콜의 메인 임무이다.
- 회사에는 우편 업무를 담당하는 직원 A가 있다.
- 우편물을 보내야하는 직원들은 직원 A에게 우편물 배달을 의뢰한다.
- 직원 A는 직원들이 이뢰한 우편물을 모아서, 우체국에 배달을 의뢰한다.
- 직원 A는 우체국으로부터 배달된 우편물을 해당 직원이 소속되어 있는 부서의 서류함에 넣는다.
-
위의 비유에서 우편 업무 담당 직원 A가 바로 전송 계층 프로토콜에 해당한다.
-
우체국은 네트워크 계층 프로토콜에 해당하며 직원 A에게 배달을 의뢰하는 다른 직원들은 응용 계층에 해당한다.
직원 역할은 크게 두 가지로 볼 수 있다.
- 다른 직원의 우편물을 수거하여 우체국에 전달 -> 프로세스 데이터를 IP 계층으로 전달
- 도착한 우편물을 각 부서의 서류함으로 분배 -> IP 계층으로부터 받은 데이터를 프로세스에게 전달
-
우편물을 각 부서의 서류함으로 정확하게 배달하려면 우편물에 적혀있는 주소 정보를 확인해야하는데. 여기서 주소는 각 부서의 이름일 것이며 이에 해당하는 것이 포트번호이다.
-
직원 A의 역할이 여기까지라고 볼 수 있고, TCP 통신에서는 다음과 같은 역할이 추가된다.
- 우편물이 목적지까지 제대로 갔는지를 확인한다.
- 우편물이 목적지까지 순서대로 갔는지 확인한다.
- 목적지 우편함이 가득 차 있어서 우편물이 반송되는 것을 방지할 것.
- 우체국이 너무 바쁘면 적절히 우편물의 양을 조절 할 것.
-
이러한 작업은 혼자서 하기 힘들고 누군가의 도움이 필요하다. 바로 목적지 회사의 직원 A와 유사한 일을 수행하는 직원들이 이러한 일을 돕는다.
-
직원 B와 협력한다면 위의 역할을 해결할 수 있다.
- 직원 B가 A에게 우편물을 잘 받았다는 메시지를 전달할 수 있다.
- 직원 A가 우편물에 번호를 부여한다면 직원 B는 메시지가 순차적으로 도착했는지를 판단할 수 있다.
- 직원 B가 우편함의 여유공간을 직원 A에게 알려준다면 우편함이 가득차서 우편물이 반송되는 현상을 방지할 수 있다.
- 위의 기능들은 TCP 통신의 기능들을 비유로 설명한 것이다. TCP 통신은 다음과 같은 기능을 제공한다.
- 신뢰성 있는 데이터의 전달 보장
- 데이터의 순차적인 전달 보장
- 흐름제어, 및 혼잡 제어
- 정리하자면 TCP는 호스트 안에서의 프로세스 식별을 통산 데이터의 배달이라는 전송 계층 프로토콜의 기본 기능을 지원하는 프로토콜이며 부가적으로 신뢰적이고 순차적인 데이터의 전달을 보장하며 흐름제어 / 혼잡 제어를 수행하는 전송 계층 프로토콜이라고 볼 수 있다.
TCP의 기능
-
호스트 안에서의 프로세스 식별을 통한 데이터의 배달
-
신뢰적이고 순차적인 데이터 전달
-
흐름제어와 혼잡제어
TCP 헤더
-
이전의 비유에서 직원 A와 B는 정보를 주고 받아야한다.
-
정보를 주고 받는다는 이야기는 둘 사잉에 연결 관계가 형성되어 공유하는 정보가 있다는 의미로 해석할 수 있다.
-
정보를 공유하는 가장 쉬운 방법은 우편물 봉투에 해당 내용을 적어보내는 것이다.
-
계층별로 카운터 파트끼리 주고 받는 정보를 주고 받기 위해서 정보를 전송해야할 데이터의 앞에 붙여보낸다. 이를 프로토콜 헤더라고 한다.
-
Source Port, Destionation Port: TCP 세그먼트를 보내는 프로세스가 사용하는 포트번호와 TCP 세그먼트를 받는 프로세스가 사용하는 포트번호이다.
-
Sequence Number: TCP는 데이터를 바이트 스트림(바이트의 흐름)으로 처리한다. TCP 세그먼트 중 헤더 다음에 오는 데이터 부분은 바이트 스트림을 순차적으로 잘라서 구성한다.
-
Acknowledgement Number: 성공적인 데이터 전달 여부를 상대방에게 알리기 위해서 사용하는 번호이다. 다음에 전달 받을 데이터의
Sequence Number
가 들어간다. -
Header Length: 기본적인 TCP 헤더의 길이는 20 바이트이지만 가변적인 옵션이 붙을 수 있다. 이 필드는 TCP 헤더 길이를 32비트 (4바이트) 단위로 나타낸다. 헤더의 최소 길이는 20바이트이기 때문에, 이 필드의 최소 값은 5(5 * 4 = 20) 이다.
-
Reserved Filed: 미래에 기능이 추가되었을 때 사용할 수 있도록 예약 해둔 비트들이다.
-
TCP Flags: TCP 세그먼트들의 기능을 표기하기 위한 8가지의 플래그이다.
- CWR: 혼잡 제어 관련 플래그이다.
- ECE: 혼잡 제어 관련 플래그이다.
- URG: 긴급 데이터의 포함 여부를 나타낸다.
- ACK: Acknowledgement 필드의 유효성을 나타낸다.
- PHS: 긴급한 데이터 처리를 요청한다.
- RST: 연결을 리셋한다.
- SYN: 연결을 시작한다.
- FIN: 연결을 종료한다.
-
Window Size: 수신 버퍼의 크기를 알린다.
-
Tcp Checksum: 세그먼트의 데이터 무결성을 검사하기 위한 필드이다.
-
Urgent Pointer: 긴급 데이터를 가리키는 포인터이다.
TCP의 상태
연결
-
TCP는 연결 지향형 프로토콜이다. 이 말은 통신을 하는 두 호스트에서 실행중인 TCP 모듈은 연결되어 있다는 것을 뜻한다.
-
연결이 되어 있다는 것은
TCP
모듈끼리 몇몇 수치들을 공유한다는 이야기일 뿐이니 연결이란 자체에 많은 의미를 부여할 필요는 없다.
-
위는 TCP 상태 다이어그램이다. 맨 처음 TCP 모듈은 CLOSED 상태로 존재한다. 여기서
Passive Open(수동형 열기)
를 하면LISTEN
상태로 전이되고,Active Open(능동형 열기)
를 하면SYN_SENT
상태가 된다. -
수동형 열기 : TCP 연결을 위해서 대기 상태로 돌입한다.
-
능동형 열기: TCP 연결을 위해서 연결 요청 세그먼트(SYN 세그먼트)를 전송한다.
TCP는 양방향 통신이기 때문에 양방향 모두 연결 요청이 완료되고 나서야 비로서
ESTABLISHED
상태가 된다. 두 페어가 SYN을 보내고 해당 SYN에 대한 ACK를 수신했을 떄 비로서 연결 완료 상태가 된다.
- 이러한 연결 과정은 보통 세번의 세그먼트 교환을 통해서 이루어지기 때문에 3방향 핸드 쉐이크라고 한다.
종료
-
TCP는 연결 종료를 요청하기 위해서,
FIN
세그먼트를 전송한다.SYN_RCVD
,ESTABLISHED
상태에서FIN
전송을 통해 연결 종료 요청을 할 수 있다. -
호스트 A가 TCP 연결을 끊기 위해서 FIN을 전송하면 호스트 B는 FIN을 기다리게 되는
FIN_WAIT_1
상태에 돌입한다. 이 상태는 FIN을 보내기만 한 상태이다. -
FIN에 대한 ACK를 수신하게 되면
FIN_WAIT_2
상태로 이동한다. 이 상태는 내 FIN이 상대방에게 도달된 상태를 말한다. 만약FIN_WAIT_1
상태에서FIN+ACK
를 수신하게 되면FIN
에 대한ACK
를 전송하고TIME_WAIT
상태로 들어간다. -
이 상태는 상대방이 자신의
FIN
을 받았다는 것을 확인한 상태이며, 상대방도 자신과의 연결을 끊기 원한다는 것까지 확인한 상태라고 볼 수 있다. 만약FIN_WAIT_1
상태에서FIN
을 수신하게 된다면FIN
에 대한ACK
를 전송하고CLOSING
상태로 이동한다. -
이 상태는 자신이 보낸
FIN
에 대한ACK
는 받지 못했지만, 상대방이 보낸FIN
은 받은 상태이다.CLOSING
상태에서 자신이 보낸FIN
에 대한ACK
를 수신하면TIME_WAIT
상태로 이동한다. 상태가 많아서 어려워 보이지만 단순하게 생각하자. -
연결이 끊어지는 CLOSED 상태가 되기 위해서는 양단 모두가 FIN을 수신해야하면 FIN에 대한 ACK도 수신해야 한다.
TCP 흐름 제어
-
TCP
는 수신 받은 데이터를 운영체제가 제공하는 버퍼에 순서대로 채운다. 버퍼에 있는 데이터들은 해당 포트에서 대기하고 있는 응용 프로그램들이 그것을 가져갈 때 까지 유지된다. -
버퍼에 사용되는 메모리는 컴퓨터의 중요한 리소스 중 하나이기 때문에, 무한한 크기의 버퍼를 사용할 수는 없다. 따라서 버퍼의 크기는 유한하며 데이터가 가득 찬 경우에는 TCP는 더는 데이터를 받을 수 없다.
-
이러한 상황을 방지하기 위해서 TCP는 상대방의 버퍼에 공간이 있을 떄만, 데이터를 전송한다. 이러한 절차와 행동 양식을 흐름제어라고 한다.
-
TCP
는 흐름제어를 위해 슬라이딩 윈도우라는 개념을 사용한다.TCP
헤더를 살펴보면 윈도우라는 필드가 있는데, 이 원도우 필드의 값에 따라서 보낼 수 있는 공간의 크기가 결정된다.
- 윈도우는 수신하는 TCP 쪽의 남은 버퍼를 의미하며, 스트림이 프로세스에 의해서 처리되어 버퍼가 빌 경우, 윈도우 버퍼가 이동하게 된다. 따라서 옆으로 이동한 윈도우에 의해서 아직 전송하지 못한 바이트 스트림에 대한 전송 공간이 발생하면 그때 전송을 시도한다.
참고 문헌
>> Home