TCP(Transmission Control Protocol,RFC 675, RFC 793)
TCP(Transmission Control Protocol,RFC 675, RFC 793)
TCP는 UDP와 다르게 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
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 길이를 포함하여 체크섬을 계산한다. 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 프로토콜] - ICMPv4
[프로그래밍 기술/TCPIP 프로토콜] - UDP(User Datagram Protocol, RFC 768)
[프로그래밍 기술/TCPIP 프로토콜] - DNS(Domain Name System, RFC 1034)
[프로그래밍 기술/TCPIP 프로토콜] - DHCP(Dynamic Host Configuration Protocol)