TCP 프로토콜 (Transmission Control Protocol)

TCP 프로토콜 설명

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

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

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

프로토콜 스택

TCP 프로토콜 스택

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

SYN이 1
   ECN을 사용할 것임을 의미함
SYN이 0
   트래픽이 혼잡하니 
   전송 윈도우 크기를 줄이라는 의미

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 길이를 포함하여 체크섬을 계산한다.
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)