total_activ

네트워크보안 v.03 _ TCP/IP Networks 공부 (TCP) 본문

공부

네트워크보안 v.03 _ TCP/IP Networks 공부 (TCP)

INFOO 2022. 10. 11. 14:27

TCP 서비스

TCP 서비스:

UDP와 같은 네트워크 계층(IP)을 이용
UDP와는 완전히 다른 서비스를 응용 계층에 제공
연결지향의 신뢰성있는 바이트스트림 서비스를 제공
- "TCP provides a connection-oriented, reliable, byte stream service" 문장 자체를 달달 외울 것


연결-지향(connection-oriented) 서비스의 의미

두 응용 프로세스 (보통 클라이언트, 서버)가 데이터를 교환 하기 전에 서로 TCP 연결을 확립함을 의미
Three-way handshake
- 예) 전화 시에 상호간 준비가 되었음을 알리기 위해 Hello라는 인사말을 서로 교환하는 것처럼...


신뢰성(Reliability) 서비스

1. 정보단위인 세그먼트를 IP로 전송함
응용이 보내는 데이터는 TCP가 전송하기 적합한 크기로 나뉘어짐
- 반면, UDP는 각 응용이 UDP 데이터그램을 적절한 크기로 만들어 줌
적절한 세그먼트 크기 결정은 18.4절 참조

 
2. TCP는 세그먼트를 보낼 때마다 타이머를 설정(21장 참조)
수신측으로부터 확인 응답 (ACK) 메세지를 기다림
확인 응답이 오지 않을 경우 세그먼트를 재전송

3. TCP가 연결의 상대편으로부터 데이터를 받으면 확인응답을 보냄
보통 짧은 시간 (<1초?) 동안 지연된 후에 보내짐 (19.3절 참조)
4. end-to-end checksum: TCP는 헤더와 데이터에 검사합(checksum)을 함
데이터가 전송 중에 변화되었는지 검출하는 것이 목적
오류가 난 세그먼트는 버리고 확인 응답을 보내지 않음 (송신자의 타임아웃과 재전송을 기다림)
5. TCP 세그먼트는 IP 데이터그램 형태로 전송되므로, 순서를 지키지 않고 (out of order) 수신측에 도착할 수 있음 / 수신측 TCP는 필요시 데이터를 재정렬해, 정확한 순서대로 응용에 전달
6. IP는 라우팅 과정에서 중복이 발생해도 이를 허용하나, 수신측 TCP는 중복된 데이터를 반드시 폐기함
시간 차이등으로 발생한 중복도 하나를 버리고 진행함

7. TCP는 흐름 제어 (flow control)를 제공함
TCP 연결의 각 종단은 유한한 버퍼를 가짐
수신측 TCP는 버퍼용량을 초과하지 않는 범위의 데이터만 버퍼에 저장
- 송신측 TCP은 수신측 TCP의 빈 버퍼 공간만큼만 보내도록 제어됨
(즉, 송신측 호스트가 너무 빨라서 느린 호스트의 버퍼를 다 쓰는 문제를 방지함

바이트 스트림 서비스 (bytestream service)

TCP 연결을 통해서 양방향의 8-bit byte stream이 교환됨
- 응용에 full-duplex 서비스를 제공: 입력 스트림과 출력 스트림이 독립됨
TCP는 레코드 구분자 삽입 기능을 전혀 지원하지 않음
- 응용은 메세지를 구분하는 단위인 레코드 구분자가 필요시, 알아서 삽입해야 함
TCP는 바이트에 대한 해석을 전혀 하지 않음
 
# Note: TCP의 주요 서비스를 설명하는데 왜 혼잡 제어는 없을까?
- "Congestion control is not so much a service provided to the invoking application as it is a service for the Internet as a whole, a service for the general good." quoted from J. F. Kurose and K. W. Ross, Computer Networking, 7th Ed., Pearson, 2017.
- 사실, 위 세 서비스는 RFC 793 (1981)에 명시된 것이므로, 그 시절엔 혼잡 제어도 없었음

 

TCP 헤더

포트 번호(port number) 필드

 

TCP 세그먼트를 송신하고 수신하는 응용을 구분하기 위해서 사용
IP 주소 하나와 포트 번호 하나의 조합을 소켓(socket)이라고 함
- 클라이언트와 서버의 두 소켓을 묶어서 socket pair라고 함
- socket pair는 인터넷 상의 TCP 연결을 유일하게 식별하는데 사용 가능한 식별자임

 

순서 번호(sequence number) 필드

송신 측의 TCP로부터 수신 측의 TCP로 가는 데이터 스트림의 바이트를 구분하기 위해 매 바이트에 붙여진 번호
- 일종의 byte-address 메모리 주소로 생각할 수 있음
32비트 부호 없는 번호로서 0부터 232 − 1을 초과하면 다시 0부터 시작
새로운 연결을 확립하는 과정에서, 세그먼트에 SYN 플래그가 설정될 경우, 순서 번호 필드에는 호스트가 연결에 선택한 초기 순서 번호(ISN)을 기재함
- 이때, SYN 플래그는 1바이트를 소모한다고 가정(즉, 송신 측의 첫 데이터는 ISN+1)


확인 응답 번호(acknowledgement number; ACK number) 필드

수신한 마지막 바이트의 순서 번호 + 1을 기재함
- 즉, 다음 수신할 첫 바이트의 순서 번호를 나타냄
이 필드는 ACK플래그가 설정 되어 있을 때만 유효
- 연결이 설립된 이후엔 계속 ACK 플래그가 설정됨

 
 
 
 

TCP에서 순서 번호와 확인 응답 번호의 특징

TCP는 각 방향으로 데이터를 흘려보내는 full-duplex 서비스를 응용에 제공 함 (동시 수송신 가능)
- 따라서, 연결의 각 종단 호스트는 각 방향에 대한 순서 번호를 저장하고 관리해야 함
TCP는 Selective ACK(SACK)나 Negative ACK(NACK)를 지원하지 않는 슬라이딩 윈도우 프로토콜의 일종임
- 확인 응답 번호 필드의 의미 상, 먼저 도착한 세그먼트나 손상된 세그먼트에 대한 정보를 알릴 수 없음
- 참고: SACK의 경우 TCP 옵션으로 추후 추가되긴 함
Cumulative ACK: 어디까지 전송이 완료되었는지 송신자에게 알림 (sliding window)


4비트 헤더 길이(header length) 필드

'32비트 워드' 단위로 헤더의 길이를 명시함
- 옵션 필드로 인해 헤더가 길이가 변할 수 있어 필요함
4비트밖에 안 되므로, 60바이트 헤더로 길이가 제한됨
- 옵션이 없는 일반적인 경우엔 20바이트임 (즉, 필드값 = 5)


6개의 플래그 비트

URG 긴급 포인터가 유효함 ( 20.8절 )
- URGent Pointer에 값이 유효한다. 거의 사용되지 않는다. (긴급처리 데이터)
ACK 확인응답 번호가 유효함
PSH 수신측은 데이터를 가능한 빨리 응용으로 보내야 함.( 20.5절)
- 빨리 보내라
RST 연결을 재설정 ( 18.7절 )
- 강제 연결 종료 후 재전송하겠다.
SYN 연결을 초기화하기 위해 순서 번호를 동기화 ( 18장 )
FIN 송신 측이 데이터 전송을 종료함 ( 18장 )
- 정상적 연결 종료 (fin, Ack - 4way handshack)


검사합(checksum)필드

TCP header와 TCP data에 모두에 대한 checksum
필수 필드로서 송신 측에서 계산, 저장되고 수신 측에서 검사됨
11.3절에 소개된 UDP 검사합과 같은 의사(pseudo) 헤더를 이용하여 계산
 

긴급 포인터(URGent pointer) 필드

(데이터 필드 앞부분에 삽입된) 긴급 데이터의 크기를 나타냄
URG 플래그가 설정되어 있을 때만 유효
송신 측이 상대편에게 긴급한 데이터를 보낼 수 있음 (20.8절)
- 긴급 데이터는 순서 번호에 계상되지 않음
요즘은 거의 안 쓰임 (쓴다면, 보안 공격용?)
 
출처 : Hoorin Park Assistant Professor, Department of Information Security, Seoul Women’s University