1-3. TCP fundamental

Posted by 월급채굴기
2017. 8. 9. 18:49 Network/CCNA

TCP Connection

  TCP의 가장 큰 특징은 UDP와는 다르게 Connection Oriented 라는 것이다(UDP는 Connection-less Oriented). 이는 TCP가 연결의 무결성과 안정성을 중시하는 신뢰성 중심의 프로토콜임을 의미한다. 사전작업과 검증작업 없이 이뤄지는 UDP연결과 달리 TCP는 미리 송수신 채널을 구축하고, 데이터 송수신을 위한 소켓(IP+Port) 개방 이전에 서버-클라이언트 검증단계를 거친다. 송수신을 위한 서버-클라이언트간 사전 검증을 3-way Handshake라고 한다. 또 안정적인 통신 종료를 위해서도 일종의 체계를 갖추고 있는데, 이를 4-way Handshake라고 한다.


TCP Flags

  3/4-Way Handshake를 위해 TCP 패킷에는 이를 위한 신호체계가 있다. 'Flag'라고 불리는 이 체계는

syn(Synchronize), ack(Acknowledgement), rst(Reset), psh(Push), urg(Urgent), fin(Finish) 로 이루어져 있다. syn는 요청의 용도로, ack는 승인 / 확인의 용도로, rst는 거절의 의미로, psh / urg는 통신 합의의 여부에 따라, fin은 문자그대로 종료의 의미로 사용된다. 이들은 3/4-way Handshake 뿐만 아니라 TCP통신의 전반적인 골격 역할을 한다.

  참고로, 이 Flag들은 TCP의 네번째 헤더된다. 이런 이유들로 인해 TCP의 헤더 사이즈는 20byte인 반면, UDP의 헤더 사이즈는 8byte이다.


), 

3-way Handshake & Flow control

  3-way Handshake는 주 데이터(송신하고자 하는 데이터)를 송/수신하기 전에 이뤄지는 서버-클라이언트간 검증 체계이다. 검증체계는 단순한데, 현관문에 비유하면 다음과 같다.

1. 문을 두드림 → 2. 확인 후 접속 승인 / 거절 → 3. 접속이 승인될 경우 승인을 확인했다는 신호를 보냄

  1번 단계는 클라이언트가 서버측에 개설된 ServerSocket으로 syn flag를 포함한 패킷을 전송하여 특정 포트로의 접속을 요청하는 것이다[각주:1]. 2번 단계에서 서버는 Serversocket에 수신된 syn 패킷을 확인한 후 접속승인여부를 결정한다. 만일 접속을 거절할 경우 Serversocket은 Clientsocket (클라이언트가 서버에 syn 패킷을 보내는데 사용된 클라이언트-사이드 소켓)에 rst패킷을 전송하고 세션이 종료된다. 접속을 승인할 경우 Serversocket은 Clientsocket에 ack 패킷을 전송하고, 클라이언트가 요청한 소켓(이 소켓을 Connectionsocket이라고 한다. 이후 주 데이터 송수신은 Serversocket이 아닌 Connectionsocket을 통해서 이뤄진다.)을 개방한다. 3번 단계에서 접속이 승인됐다는 서버의 ack 패킷을 수신한 클라이언트는 해당 승인을 확인했다는 의미로 ack 패킷을 Serversocket으로 전송 후 Connectionsocket으로 주 데이터를 송수신한다. 3단계가 끝난 상태의 세션을 Established로 구분한다.

   또, 2단계에서 서버가 접속을 승인후 ack 패킷을 클라이언트에 반환할때, 해당 패킷에 windows size 데이터를 함께 담아 전송한다. window size는 세션이 연결되는 포트가 처리할 수 있는 데이터량을 의미한다(MTU). window size를 수신한 클라이언트는 window size에 알맞도록 데이터를 조각화(Fragmentation)되도록 한다. 이후 서버에 도착한 데이터 조각은 각 조각에 부여된 번호에 따라 재조립된다(Reassembled). 참고로 이 Fragmentation/Reassembled 과정으로 인해 인터넷 속도 저하가 일어난다. IPv6가 IPv4보다 무거움에도 불구하고 인터넷속도가 더 빠른 이유이기도 하다. IPv6의 경우 Fragmentation/Reassembled 과정이 각각 클라이언트와 서버자체에서 일어나지만, IPv4의 경우 Fragmentation 과정이 클라이언트가 아닌 라우터에서 일어난다. 이로인해 많은 수의 호스트를 갖는 라우터에 병목현상이 일어나 인터넷 속도가 저하되는 것이다. 다시 Fragmentation/Reassembled 얘기로 돌아오자면, TCP는 Fragmentation을 통해 패킷을 분할하여 데이터를 전송한다. 이 때 각 패킷이 제대로 전송되었는지 확인하기 위해서 TCP는 크게 두가지의 검증방식을 사용할 수 있다. Stop-and-Wait 방식과 Sliding window 방식이다. 

  Stop-and-Wait 방식은 송식측이 데이터를 송신한 후 수신측으로부터 수신 확인 패킷이 오기전까지 데이터 전송을 멈추는 것이다. 수신 확인 패킷은 ack 패킷으로, ack 값이 1인 경우 방금 전의 데이터를 정상적으로 수신하였다는 것을 의미한다. 지정된 시간내에 패킷이 1의 보수를 활용하여 판단한 ack 혹은 nak 패킷[각주:2]이 송신측에 도착하지 않는 경우 RTO(Retransmission TimeOut) 상태가 되어 수신측은 해당 세션의 데이터를 처음부터 다다시 전송할 것을 요구한다. 문제는 수신 확인 패킷을 수신하였으나 해당 패킷이 손상되어 ack값인지 혹은 해당 값 수신 확인 값이 아니라 손상된 데이터 몸체인지 알 수 없는 경우가 있다. 추가적인 검증 비트(checksum)를 할당하는 방법은 일시적인 해결방법일 뿐 근본적인 해결방법이라 할 수 없다. 또, 수신측이 nak 값을 반환하여 당 데이터를 재전송할 경우에도 문제가 발생한다. 데이터의 재전송은 해당 세션 채널에 중복된 응답(Duplicated Packets)를 발생시킨다. 이는 두 패킷중 어떤 패킷이 손상된 패킷인지, 재전송된 패킷인지 알 수 없는 상태를 만든다.

   따라서 각각의 패킷에 번호를 붙이는 Sequence number 방법이 추가적으로 사용되고 있다. 각각의 데이터 전송패킷에는 번호가 붙고, 이에 대한 수신응답 패킷에도 ack / nak 뿐만 아니라 응답 패킷의 번호가 추가적으로 첨부된다. 만약 같은 번호의 패킷에 대한 응답 패킷이 세션에 두개가 존재하고 둘다 모두 ack인 경우엔 nak으로 해석하여 세션상 동일한 두 데이터 패킷중 어느 패킷이 손상되지 않은 패킷인지에 대한 문제를 해결할 수 있다. 세션 채널 상에 동일한 번호 패킷에 대한 응답 패킷(Duplicated ack)이 세개 존재한다면 CWD 상태(Congestion window size)로 간주하여 window size를 0 혹은 절반으로 줄이고[각주:3] 처음부터 재전송을 요구한다. 

  참고로, DDoS공격의 방법중 하나가 3-way Handshake를 이용한다. 클라이언트가 Serversocket에 syn요청을 한 경우 서버는 해당 소켓에 할당된 포트를 열고 ack 패킷을 돌려보낸다. 이 때 해당 소켓에 할당된 포트는 클라이언트로부터 ack패킷이 반환될 때 까지 열려 있는데, 이를 이용한 것이다. 매우 많은 수의 bot을 동원하여 서버에 syn요청을 한 후 ack 반환을 의도적으로 하지 않는 방식이다. 이처럼 모든 포트가 bot의 ack 반환을 기다리게 될 경우 서버는 정상적인 서비스 제공을 할 수 없는 상태에 빠진다. 위처럼 클라이언트의 ack반환을 기다리고 있는 세션을 half-open 상태의 세션이라고 한다. 따라서 Establishded되지 않고 half-open 상태인 세션이 다수를 차지할 경우 공격을 의심해볼 수 있다.


4-way Handshake

  4-way Handshake는 세션을 종료할 때 사용된다. 과정은 다음과 같다.

1. A가 B에 fin 패킷을 전송 → 2. B가 A에게 ack과 함께  3. fin 패킷을 전송 → A가 B에게 ack 패킷 전송



 

  1. 1번 단계는 서버측에 이미 ServerSocket이 개방되어 있고, 통제 프로세스가 실행중이란 것을 전제로 한다. [본문으로]
  2. ack과 nak은 checksum에 따라 결정된다. checksum 은 우선 , 전송될 데이터를 2byte 단위로 나눈후 각각의 바이트 값들을 모두 더한다. 각각의 바이트 값들이 모두 더해진 값에 1의보수를 취한 값이 checksum 값인데, 송신측은 checksum과 원본데이터를 함께 전송하고 수신측은 checksum 값과 원본데이터 값을 더하여 데이터 손상 여부를 판별한다. 두 값을 더한결과 모든 비트가 1인경우 데이터가 손실되지 않은 것이고 비트 한자리라도 0이 껴있을 경우 데이터가 손상된 것이다. [본문으로]
  3. window size는 전송이 지속될수록 빠르게 증가한다. [본문으로]

'Network > CCNA' 카테고리의 다른 글

[GNS3] 0. GNS 기본설정  (0) 2017.08.25
1-5. IPv4 fundamental & subent  (0) 2017.08.12
1-4. MAC fundamental  (0) 2017.08.09
1-2. OSI 7 Layer  (0) 2017.08.08
1-1. Network Fundamentals  (0) 2017.08.07