TCP 프로토콜 설명
TCP는 UDP와 다르게 Stream기반의 프로토콜이다. 스프림 기반인 TCP는 송신 버퍼와 수신 버퍼 사이에 가상의 통로를 갖고 있으며 신뢰성있는 통신을 제공한다.
참고: RFC 793, https://www.ietf.org/rfc/rfc793.txt
위키 백과 전송 제어 프로토콜, http://en.wikipedia.org/wiki/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)