네트워크 및 보안/TCPIP 프로토콜

TCP(Transmission Control Protocol,RFC 675, RFC 793)

언제나휴일 2015. 2. 2. 17:37
반응형

TCP(Transmission Control Protocol,RFC 675, RFC 793)



TCPUDP와 다르게 Stream기반의 프로토콜이다. 스프림 기반인 TCP는 송신 버퍼와 수신 버퍼 사이에 가상의 통로를 갖고 있으며 신뢰성있는 통신을 제공한다.

참고: RFC 793, https://www.ietf.org/rfc/rfc793.txt

     위키 백과 전송 제어 프로토콜, http://en.wikipedia.org/wiki/TCP


프로토콜 스택

 

0~7

8~15

16~23

24~31

Source Port

Destination Port

Sequence no.

Acknowledgment no.

HDLEN(4)

Reserved

(3)

N

S

C

W

R

E

C

E

U

R

G

A

C

K

P

S

H

R

S

T

S

Y

N

F

I

N

Window Size

Checksum

Urgent pointer

Options(0~320 bits)

 

Source Port: 발신지 포트

Destination Port:목적지 포트

  Well Known Ports:

      7(Echo), 9(Discard), 11(Users), 13(daytime), 17(Quote), 19(Chargen), 20(FTPD), 21(FTP),

      23(TELNET), 25(SMTP), 53(DNS), 67(Bootps), 79(Finger), 80(HTTP)

      68(Bootpc), 69(TFTP), 111(RPC), 123(NTP), 161(SNMP), 162(SNMP)

Sequence no.: 시작할 때 Random Num ISN(Initial Sequence Number) 설정,

            ISN + 세그먼트에 포함하는 첫 번째 데이터의 바이트 번호

            : ISN 1000일 때 첫 번째 세그먼트의 seq 1000,

               첫 번째 세그먼트의 크기가 150일 때 두 번째 세그먼트의 seq 1150

            주의) SYN 1일 때 데이터 크기가 없어도 순서 번호를 1 증가한다.

                 FIN, ACK 1일 때 순서 번호를 1 증가한다.

Acknowledgment no.: 받은 세그먼트의 seq + 받은 데이터 바이트

HDLEN: TCP 헤더 길이(단위 4바이트), 이 값으로 데이터의 위치를 계산할 수 있다.

           : HDLEN 5일 때 헤더 길이는 20

Reserved: all 0s

NS: ECN nonce concealment protection (RFC 3540, http://tools.ietf.org/html/rfc3540)

    송신자에서 CWR, ECE 필드를 실수 혹은 악의적으로 은폐를 보호하기 위해 추가하였음

CWR: ECE를 수신하여 전송 윝도우 크기를 줄였으니 더 이상 ECE를 보내지 말라는 의미

ECE: ECN Echo

    SYN1일 때는 ECN을 사용할 것임을 의미함

    SYN0일 때는 트래픽이 혼잡하니 전송 윈도우 크기를 줄이라는 의미

URG: 수신한 세그먼트의 순서가 어긋났을 때 Urgent Pointer가 유효함을 의미

ACK:  수신 패킷, 클라이언트가 보낸 최초의 SYN 패킷 이후의 모든 패킷은 설정

    Selective ACK TCP 헤더 끝에 옵션으로 순서에 어긋나게 들어오거나 중복으로 온 것을 알림

       전송 후 RTO 타이머(보통 500ms)를 구동하여 타임 아웃까지 ACK를 수신하지 못하면 재전송

       지연 ACK -RTO 타임 아웃 이후에 수신한 ACK를 지연 ACK라 부른다.

                  이로 인해 수신 측에 중복 세그먼트 현상이 발생할 수 있다.

PSH: 푸시 기능

RST: 명확한 연결 해제

     연결 요청을 거절할 때, WAIT 상태의 연결을 종료할 때, 연결을 중단할 때

SYN: TCP 연결 과정인 Three Handshake의 두 개의 패킷

FIN: 송신 측 데이터가 더 이상 없음을 의미

Window Size: 수신 측에서 크기를 결정하고 송신 측에서는 이를 따른다.

    초기에 수신 버퍼 크기를 설정하고 이 값을 사용

    수신 버퍼에 처리하지 않은 세그먼트 바이트를 뺀 값으로 설정

    윈도우 사이즈가 0일 때 수신할 수 없음, 공격으로 의심할 수 있다.

    Silling Window,  Nagle 알고리즘, Clark 알고리즘, Delayed Acknowledgement

    Slow Start – 초기 Window size MSS로 설정, 수신 후에 MSS만큼 증가

        물론 실제 수신할 수 있는 크기보다 커질 수 없으며 이 후에는 일반적인 알고리즘 적용

        혼잡 회피 알고리즘을 가미하여 MSS만큼 증가시키지 않고 1씩 증가

        RTO 타임 아웃에 의해 지연 인지 시

            최대 윈도우 사이즈 임계값을 현재 윈도우 사이즈/2 로 변경

            전송 윈도우 사이즈를 MSS로 줄임

            다시 Slow Start

        세 개의 ACK 수신하면

            최대 윈도우 사이즈 임계값을 현재 윈도우 크기 2배으로 설정

             cwnd(전송 윈도우)의 값을 임계치의 값으로 설정

             혼잡 회피 알고리즘 시작

    RTO 조절 – 손실 하면 RTO값을 2배로 늘림

         전송이 성공하면 이 후의 RTO는 초기 RTO값을 사용한다.

    TCP Probe Window size 0을 가진 세그먼트를 수신하면 Persistence Timer 가동,

         Persistence 타임 아웃 시 발송하는 세그먼트

         수신 측으로부터 확인 응답을 받지 못하면 영속 타이머 값을 2배로 늘림(보통 60초까지)

    Keepalive 타이머 – 보통 2시간동안 TCP Probe를 보내도 확인 응답을 받지 못하면 연결을 종료

 

Checksum: IP 주소와 프로토콜, TCP 길이를 포함하여 체크섬을 계산한다. UDP 체크섬과 방법은 같으며 프로토콜 번호만 6이다.

0~7

8~15

16~23

24~31

Source IP Address

Destination IP Address

All 0s

6

UDP Total Length

Source Port

Destination Port

Length

Checksum

Data

 

Urgent pointer: URG 플래그가 1일 때만 유효하다.

    이 필드의 값과 순서 번호를 더하면 마지막 긴급 바이트 번호를 알 수 있다.

    데이터 영역의 시작 위치에서 이 필드의 값을 더한 위치에 일반 데이터 배치 가능

Options: 최대 40바이트(4바이트의 배수로 채워짐)

    End of option list(1바이트): 00000000

        옵션 구간의 끝에 붙는 패딩에 사용, 다음 옥텟에 데이터가 있음

    No operation(1바이트): 00000001

        단순히 옥텟 단윌로 옵션을 채우기 위해 사용

    MSS(4바이트) : 00000010 + 길이(1바이트) + MSS(2바이트)

        연결 단계에서 결정(디폴트 값은 536)

    Window Scale(3바이트): 00000011 + 길이(1바이트) + Scale(1바이트)

        Scale 값은 2의 승수를 의미하며 윈도우 크기를 확장할 때 사용

        연결 설정 단계에서만 결정

    Timestamp(10바이트): 00001000 + 길이(1바이트) + Timestamp (4바이트) + Timestamp reply(4바이트)

        SYN 내에 타임 스템프를 알리고 SYN, ACK에 타임 스템프 reply

        왕복 시간을 측정 위해 사용, 서버에서 SYN, ACK에 타임 스템프 replay를 안 보내면 거절

    SACK permitted(2바이트): 00000100 + 길이(1바이트) +  OK  여부(1바이트,0:거절, 1: 허락)

        SYN 내에 SACK 옵션을 제공할 수 있음을 전달

        수신 측에서 SYN, ACK SACK 옵션을 추가하면 양쪽이 SACK 옵션 사용

    SACK(가변길이): 00000101 + 길이(1바이트) + 1'st edge(8바이트) + ...+ nth edge

         edge start seq(4바이트) + end seq(4바이트)



다른 네트워크 프로토콜

[프로그래밍 기술/TCPIP 프로토콜] - ethernet

[프로그래밍 기술/TCPIP 프로토콜] - ARP(Address Resolution Protocol)

[프로그래밍 기술/TCPIP 프로토콜] - IPv4

[프로그래밍 기술/TCPIP 프로토콜] - ICMPv4

[프로그래밍 기술/TCPIP 프로토콜] - UDP(User Datagram Protocol, RFC 768)

[프로그래밍 기술/TCPIP 프로토콜] - DNS(Domain Name System, RFC 1034)

[프로그래밍 기술/TCPIP 프로토콜] - DHCP(Dynamic Host Configuration Protocol)

반응형

'네트워크 및 보안 > TCPIP 프로토콜' 카테고리의 다른 글

DNS(Domain Name System, RFC 1034)  (0) 2015.02.03
DHCP(Dynamic Host Configuration Protocol)  (0) 2015.02.02
UDP(User Datagram Protocol, RFC 768)  (0) 2015.02.02
ICMPv4  (0) 2015.02.02
ARP(Address Resolution Protocol)  (0) 2015.02.02
IPv4  (0) 2015.02.02
ethernet  (0) 2015.02.02