2020. 2. 14. 14:03ㆍSecurity/네트워크
* TCP
point to point
- 엔드 시스템에서만 작동
- 엣지에서만 작동
- 순서가 바뀌지 않고 장애가 없음
신뢰적인 in-order byte stream
- 순서가 바뀌지 않고 장애가 없음
- Message에 구분이 없다.
pipelined
- 혼잡제어나 흐름제어를 통해 window size를 제어.
- 단, 흐름제어는 크게 신경쓰지 않는 경우가 많다.
buffer
- 송,수신측은 buffer를 가짐.
full duplex
- 동일 connection에 양단이 동시에 data를 전송 할 수 있다.
- MSS : maximum segment size(segment에서 app layer data의 최대 크기)
connection oriented
- handshake를 먼저 수행.
Flow control(흐름 제어)
- receiver에서 수행
- sender가 receiver를 압박하지 못하도록 receiver가 전송량을 통제.
* TCP segment의 구조
source port #
- 송신자의 port number
dest port #
- 수신자의 port #
sequence number
- packet의 byte stream number
acknowledgement number
- 상대방이 다음에 받아야 할 packet의 sequence number
- 누적 ACK(만약 5000이라면 4999까지 잘 받았다는 의미)
header len(gth)(4bit)
- options가 만약 생기면 늘어날 수 있음
not used(6bit)
- header length의 다음 6bit는 아직 사용하지 않음.
U(URG)
- urgent point
- 1이면 urg data pointer를 읽어야하고, 0이면 무시.
- 현재는 사용하지 않아서 U와 urg data pointer 모두 사용하지 않아 쓰레기값이 들어있음
A(ACK)
- 1이면 acknowledgement number를 읽고, 0이면 무시
- 0이면 응답 패킷이 아니라는 의미
P(PSH)
- packet의 우선순위를 정함
- 사용하지 않음.
R(RST)
- 1이면 tcp connection을 reset(초기화)
- reset의 의미는 연결을 끊지않고 기존의 socket을 유지하면서 접속을 초기화.
- client나 server 누구나 먼저 보낼 수 있음
S(SYN)
- client가 먼저 보냄
- syn signal. 접속이 없어서 접속을 하기위해 신호
- 첫번째 신호는 client가 server에게 1을 보내고 server가 client에게 다시 1을 보내고 세번째 신호를
- sequence number와 window size에 대해서 주고 받음.
- 3번째 신호는 의미가 없음.
- syn flooding 공격에 사용됨.
F(FIN)
- 대부분 client가 먼저 보냄.
- 접속을 끊는 것.
receive window 또는 flow control용 window size
- 패킷을 보낼때마다 가용할 수 있는 메모리 버퍼 사이즈를 알려줌.
- 일종의 흐름제어
checksum
- 패킷이 손상됐는지 확인
- IP와 달리 전체 packet이 깨졌는지 확인
urgent point(urgent data pointer)
- 사용하지 않음
옵션 및 데이터
- 대부분 존재하지 않음.
christmas packet
- R과 S, S와 F는 동시에 1인 경우가 존재할 수 없는데 R, S, F중 2개 이상이 1인 패킷
- destination port의 application(서비스)이 구동(반응)중인지 확인해보기 위해서 보냄.(=스캔)
- 스캔 공격에 사용되기도 함.
* TCP sequence number와 ACK
sequence number
- segment의 첫번째 byte의 stream에서의 byte 순서 번호
- 시작 sequence number는 종료된 접속의 남아있는 segment와 유효한 segment와의 혼동을 막기위해 임의로 선택
ACKs
- 다음에 받을 첫번째 byte의 순서 번호
- Cumulative ACK가 가능.
- 만약 순서가 틀린 segment를 수신한 경우에는 즉시 버리거나 buffering(중간에 빠진 data를 받기 위해)한다.)
seq=42, ACK=79, data='C'
- a(client)가 b에게 c라는 data를 보냄.
- 내가 지금 보내는게 sequence number는 42번, ack는 78번째 byte까지 잘 받았고 79번째 byte부터 보내라는 의미
seq=79, ACK=43, data='C'
- b가 다시 a에게 c라는 data를 보냄.
- 내가 지금 보내는게 sequence number가 79번, ack를 42번까지 잘 받았고 43번째 byte부터 보내라는 의미
* RTT & Timeout
- time out이 rtt보다 짧으면 재전송이 너무 많이 이뤄지고 길면 segment 손실에 대한 대응이 늦어짐
- 따라서 time은 rtt보다 조금 더 길어야 한다.
estimatedRTT
- SampleRTT의 가중 평균 값
- 측정값의 12.5%만 적용. 권고사항이기때문에 반드시 지키는 것은 아님.
SampleRTT
- 실제로 측정된 RTT
- segment가 송신된 시간으로 부터 ACK가 도착한 시간간격
- 재전송 segment는 무시
devRTT
- sampleRTT가 estimatedRTT로 부터 얼마나 벗어나느지에 대한 예측
- sampleRTT가 얼마나 변동이 심한지를 의미한다고 볼 수 있음.
- netwokr가 불안하면 devRTT가 커지고 안정되어있다면 devRTT가 작아진다.
timeout 설정
- time out이 rtt보다 짧으면 재전송이 너무 많이 이뤄지고 길면 segment 손실에 대한 대응이 늦어짐
- 따라서 time은 rtt보다 조금 더 길어야 한다.
- EstimatedRTT보다 약간의 여유값을 더한 값으로 설정
- 실제 timeout의 설정은 EstimatedRTT + 4*DevRTT로 한다.(반드시는 아님)
* TCP RDT(reliable data transfer)
- TCP는 비신뢰적인 IP 상위에서 신뢰적인 통신 서비스를 제공.
- Pipelined segment 사용
- 누적 ACK 사용.
- TCP는 segment 각각에대한 timer가 아닌 단일 재전송 timer를 사용.
- 전송 segment 각각에 대한 timer는 개념적으로는 쉽지만 overhead가 크다.
- timeout, 중복 ACK이 일어나면 재전송 한다.
- 간소화된 TCP sender는 중복 ACK, 혼잡제어, 흐름제어 무시
* TCP sender event
1. application으로 부터 data 수신
- sequence number를 가진 segement 생성
- sequence number는 첫 번째 byte의 byte stream 번호
- timer 시작(다른 segment에서 의해서 timer가 작동중이 아닌 경우)
- timer의 만료 주기는 timeoutInterval
2. timeout
- timeout을 일으킨 segment를 재전송
- timer 재시작
3. ACK가 확인되지 않은 segment의 ACK인 경우
- ACK의 sequence number가 sendbase보다 크면 이전에 확인되지 않은 segment에 대해 확인하고 sendbase를 갱신
- 아직 확인 응답 안된 segment가 존재하면 timer를 재시작.
* TCP 전송 경우의 수
1. ack가 loss 됐을때
- a가 시퀀스 92번부터 8bye인 data를 99번까지 보냄
- ack가 100인 packet을 보냈는데 loss
- a가 다시 보내고 이번에는 응답
- 이 그림은 pipeline을 하지 않음
2. time out
- sequence number가 92, data가 8byte인 packet 전송.
- sequence number 100으로 이동
- sequence number가 100, data가 20byte인 packet 전송.
- ack 100이 오기전에 timeout이 발생해서 sequence number가 92, data가 8byte인 packet 재전송.
- ACK가 100인 packet을 기다리는데 100인 packet과 120인 packet이 둘 다 날라와서 sendbase를 100으로 옮겼다가 다시 120으로 이동
- 그 다음에 한번 더 오는 ACK가 120인 packet은 그냥 무시
3. 누적 ACK인 경우
- sequence number가 92, data가 8byte인 packet 전송.
- ACK가 100인 packet을 보내다가 loss
- sequence number 100으로 이동
- sequence number가 100, data가 20byte인 packet 전송.
- ACK가 120인 packet 전송
- 기다리던 ACK가 100인 packet은 안오고 ACK가 120인 packet이 들어옴
- sendbase는 ack가 120인 packet을 보고 100인 packet이 들어오지 않았지만 send base를 120으로 옮김
TCP의 생성 권고
* TCP의 빠른 재전송
timeout이 유발하는 재전송의 문제
- timeout이 길어 segment를 잃어 버렸을때 송신자를 기다리게 해서 종단간 지연이 증가.
중복된 ACK와 segment loss
- 수신자는 기다리는것보다 큰 sequence number의 segment를 수신하면 이를 buffering하고 중복 ACK를 전송
- segment를 손실하면 많은 중복된 ACK가 전송 됨.
3번의 중복된 ACK가 sender에게 전송된 경우
- 해당 segment가 loss되었다고 판단
- 이 경우에는 timeout이전이라도 해당 segment를 재전송(fast retransmit)
ex) sequence number가 10, 20, 30, 40, ...일때 20이 loss되면 그 이후의 packet을 보낼때 마다 ACK(20)이 중복해서 sender에게 전달.
'Security > 네트워크' 카테고리의 다른 글
OSI 7계층 (1) | 2020.10.20 |
---|---|
network - transport layer(4) (0) | 2020.02.19 |
network - transport layer(2) (0) | 2020.02.12 |
패킷의 이해 (0) | 2020.02.11 |
wireshark 기본 사용법 (0) | 2020.02.11 |