태그: Acknowledgment no

TCP 프로토콜 설명

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

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

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

프로토콜 스택

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:

 

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

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

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

Reserved: all 0s

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

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

ECE: ECN Echo

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

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

PSH: 푸시 기능

RST: 명확한 연결 해제

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

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

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

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

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

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

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

세 개의 ACK 수신하면

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

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

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)

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

SACK(가변길이): 00000101 + 길이(1) + 1’st edge(8) + …+ nth edge

edge – start seq(4) + end seq(4)