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)
'네트워크 및 보안 > 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 |