일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 해킹
- Spring
- 정보보안기사
- OS
- webhacking
- 웹해킹
- Spring MVC
- wargame
- pwnable
- webhacking.kr
- Pwnable.kr
- Spring Framework
- PWN
- System
- 네트워크
- BOF
- SQL
- hacking
- Operating System
- 정보보안기사 실기
- Payload
- Lord of BOF
- system hacking
- 정보처리기사 실기
- Buffer Overflow
- stack overflow
- 워게임
- Shell code
- LOB
- 운영체제
- Today
- Total
DongDD's IT
TCP - State Transition, Flow Control, Error Control 본문
TCP
Connection Establishment Diagram
Establishment 에는 5가지 상태가 있음
1) LISTEN : SYN 받기를 기다리는 상태 (Server)
2) SYN-SENT : SYN을 보내고 ACK을 기다리는 상태
3) SYN-RCVD : SYN을 받고 ACK을 보냄
4) EStABLISHED : 3-handshake 이후 연결이 된 상태
5) CLOSED : 연결 종료 상태
3-Handshake Termination
3-Handshake에는 4가지 상태가 있음
1) FIN-WAIT-1 : 연결 종료를 위해 FIN을 보낸 상태
2) CLOSE-WAIT : FIN을 받은 후 FIN+ACK을 보내기 전까지의 상태
3) LAST-ACK : FIN+ACK이후 마지막 ACK을 받기 위해 기다리는 상태
4) TIME-WAIT : ACK을 보낸 후 일정시간 종료하지 않고 기다리는 상태
4-Handshake에는 5가지 상태가 있음
1) FIN-WAIT-1 : 연결 종료를 위해 FIN을 보낸 상태
2) FIN-WAIT-2 : FIN에 대한 ACK을 받은 후 FIN을 기다리는 상태
3) CLOSE-WAIT : FIN을 받은 후 FIN을보내기 전까지의 상태
4) LAST-ACK : FIN이후 마지막 ACK을 받기 위해 기다리는 상태
5) TIME-WAIT : ACK을 보낸 후 일정시간 종료하지 않고 기다리는 상태
Time-Wait 상태를 두는 두 가지 이유
1) 마지막 ACK이 없어진 경우 Server측은 다시 FIN을 보내게 되는데 이 FIN에 대한 ACK을 보내기 위해 바로 종료하지 않고 기다림
2) 같은 Port 번호 부여로 생기는 error를 막기 위해 기다림. time-wait이 지난 후에는 같은 Port 번호이더라도 다른 연결로 취급함
Window Size
- Packet을 보낸 후 ACK을 받기 전까지 보낼 수 있는 Maximum
Left wall(왼쪽 끝) : ACK이 오는 것에 따라 변함(Closing - 오른쪽으로 이동)
Right wall(오른쪽 끝) : 상대가 보내는 rwnd(window size)에 따라 변함 (Opening - 오른쪽으로 이동, Shrinking - 왼쪽으로 이동)
- Shrinking은 Time delay로 보통 발생하는데 TCP에서는 일어나지 않도록 되어있음
Flow Control
- 네트워크 상황이나 Receiver측의 상황을 고려해 보내는 양을 조절
Window size = minimum(rwnd,cwnd)
rwnd : Receiver가 받을 수 있는 양
cwnd : Network 상태에 따른 보낼 수 있는 양
현재는 컴퓨터 성능이 향상되어 일반적으로 cwnd가 rwnd보다 작을 확률이 높음
Silly Window Syndrome
- Header에 비해 보낸 data의 크키가 작아 overhead가 생기는 현상
1. 송신 측
- 해결책
1) Nagle 알고리즘
- 하나의 packet 전송 후 MSS를 채울때까지 기다리는 방식
- MSS가 찰 때까지 무작정 기다리는 것을 비효율적일 수 있기 때문에 Maximum wait time(ACK이 올때까지)를 두어 비효율성을 방지함
- Delay에 민감한 Application에서는 사용하지 않는 것이 좋음
2. 수신 측
- 해결책
1) Clark 알고리즘
- 수신 측의 window size가 작을 경우 sender에게 rwnd를 0으로 표시해서 보냄
- Sender는 이 window size를 보고 전송을 멈춤
- Receiver는 buffer에 있는 data를 비우다가 MSS크기가 되거나 buffer가 반 이상 비워지면 제대로 된 rwnd를 보냄
- 이 packet이 손실될 수 있기 때문에 Sender측에서는 수시로 probe를 보내 rwnd를 받음
2) 확인응답 지연
- 수신 측의 window size가 작은 경우 ACK을 보내지 않고 그냥 기다리는 방식
Ref ) SYN Flooding
- 흔히 많이 알려진 DoS(Denial of Service) 공격
- 연결 요청 큐를 꽉 채워 다른 SYN을 받지 못하게 하는 방식
- 인위적으로 header를 수정하여 보내기 때문에 SYN을 받고 SYN+ACK을 보내지만 이에 대한 ACK을 받을 수 없기 때문에 연결을 하지 못하고 큐에 계속 남아 다른 SYN이 오지 못함
- DDoS(Distributed Denial of Service) : DoS 공격을 막기 위해 여러 방법이 생겨 DoS공격을 한 사람이 분산시켜 보내는 공격 방법
Error Control
1. Normal Operation
- Overhead를 줄이기 위해 ACK수를 줄이는 방법
1) Rule 1 : data를 받고 ACK을 보낼때 sending buffer를 보고 data가 있으면 같이 보냄
2) Rule 2 : Sending buffer에 data가 없을 때 특정시간(500ms) 기다린 후에 보냄.
-> data가 들어올 때: ack과 같이 보냄
-> data가 안들어올 때: ack만 보냄
3) Rule 3 : Sending buffer를 기다리는 동안 두 개의 packet이 오면 바로 ack을 보냄
-> 이 때 Sending buffer에 data가 있으면 같이 보냄
2. Lost Segment
- packet loss로 문제가 생겼을 때
1) Rule 4 : Packet loss로 packet의 순서가 바뀌어서 왔을 때 바로 ack을 보냄
2) Rule 5 : 못 받았던 data가 들어오면 바로 ack을 보냄
3. Lost Acknowledgment
- ack loss로 문제가 생겼을 때
1) Rule 6 : Ack이 사라져서 같은 data가 온 경우 바로 ack을 보냄
4. Fast retransmission : packet 손실 후 timeout까지 기다리는 비효율성을 방지하기 위해 사용
- 이 방법을 쓰지 않으면 packet loss를 timeout까지 가서 detect해야 함 (비효율적)
- packet 전송 후 제대로 된 ack이후 같은 ack이 3번 올 경우 packet loss로 간주하고
이 후에 보냈던 data 다시 전송(Three duplicate ack)
Congestion Control(혼잡 제어)
- Packet switching Network이기 때문에 발생하는 혼잡으로 Bottleneck(병목현상)이 일어나는 것을 막기 위해
필요
Load : Network에 보내는 data양을 늘리는 정도
1. Slow start, exponential increase
- cwnd의 size = 1
- threshold에 도달할 때까지 exponential increase로 증가함
2. Congestion, additive increase
- cwnd의 size = 특정 size
- Congestion이 detect될 때까지 1씩 증가시킴
- 3 duplicate ACK으로 Congestion을 감지한 경우는 심한 혼잡이 아니라 판단하고 cwnd를 반으로 줄여 additive increate로 바꿈
- Time-out으로 Congestion을 감지한 경우는 심한 혼잡이라 판단하고 threshold를 현재 cwnd의 반으로 줄이고 cwnd를 1 MSS로 바꾼 후 exponential increase로 바꿈
TCP Fair
- 시작 점이 다르더라도 TCP에서는 같은 bandwidth 되도록 되어 있음
-> 하나의 bandwidth를 1/n씩 나눠가지게 됨 (RTT가 같을 경우)
- throuput의 합이 congestion 경계선을 넘어가면 반으로 줄어들게 되고 증가하는 폭은 RTT가 같을 경우 y=x와 평행하게 증가하고 결국 y=x 에 수렴하여 Fair하게 bandwidth를 나눠가짐
- RTT : Packet을 보내고 ack을 받을 때까지의 시간
example)
- Maximum capacity = 100Mbps
- c1 RTT = 20ms, c2 RTT = 10ms
-> c1 Throughput= 33.3Mbps, c2 Throughput= 66.6 Mbps
TCP Timers
1. Retransmission Timer : Fast Retransmission에 쓰이는 Timer
2. Persistence Timer : Clark 알고리즘에서 정상적인 rwnd의 packet이 손실 될 경우 사용
-> rwnd=0을 받으면 TImer시작, Time out시 probe 세그먼트 전송
3. Keepalive Timer : 오랜기간 idel 상태에 있는 것을 방지
-> 서버가 2시간 동안 클라이언트로부터 packet을 받지 못하면 probe 세그먼트 전송
4. TIME_WAIT Timer : Connection Termination후 종료될 때까지 wait하는 timer
RTT, RTO
1. RTTs(Smoothed RTT)
- default : X
- 첫 번째 측정 : RTTs = RTTm
- 이후 측정 : RTTs = (1-a)RTTs + aRTTm
-> RTTm : 현재 측정된 값, a = 1/8 (현재 측정값의 가중치)
2. RTTd(RTT Deviation)
- default : X
- 첫 번째 측정 : RTTd = RTTm/2
- 이후 측정 : RTTd = (1-B)RTTd + B|RTTs-RTTm|
-> RTTs : 이번에 계산된 RTTs, B= 1/4 (새로구한 편차의 가중치)
3. RTO(Timer에 사용할 값)
- default : 임의
- 이후 측정: RTO = RTTs + 4*RTTd
4. Karn's Algorithm
- 재전송에 대한 RTO계산을 하지 않음
- Timeout 이후 재전송한 후에 ack이 오는 경우가 있기 때문에 RTO계산을 하지 않음
- 재전송을 할때는 RTO*2로 해서 보냄
TCP Options
1. Single-byte
1) End-of-option option : option의 마지막에 쓰임
2) No-Operation option : option의 빈 공간을 채움
2. Multiple-byte
1) Maximum-segment-size option
- Recevier가 받고 싶은 size를 Sender에게 요청
2) Window-scale-factor option
- Bandwidth가 증가함에 따라 window size를 증가하기 위해 사용
- 1byte형태로 되어있고 이 값을 x라 할때 window size = window size * 2^x
-> 1), 2)은 Connection setup 과정에서 설정
3) Timestamp option
- RTT측정에 사용하기위해 사용
- Sender가 보내는 시간을 적어서 보냄, 이 정보가 적혀있는 ack이 오면 현재 시간에서 적혀있는 시간을 빼서 RTT 계산
- 또한 PAWS(Protection Aginst Wrapped Sequence Number)에 사용
-> file이 클경우 Sequence Number는 32bit가 최대 이므로 Sequence Number가 재사용되어야 하는 경우에 Timestamp를 사용해 혼동을 막을 수 있음
4) SACK
- Packet loss 이후 받은 packet의 Sequence number block을 표시
- 또한 Duplicate block도 표현
'네트워크' 카테고리의 다른 글
IPv4 Address - Classless network, slash notation, subnet rule, special address, NAT (0) | 2017.08.28 |
---|---|
IPv4 Address - Classful addressing, Network id, Cast, Classful subnet (0) | 2017.08.27 |
Network Layer - Router, Switching, Delay, Processing (0) | 2017.08.20 |
TCP - TCP UDP 특징, TCP Header, Connection (0) | 2017.07.30 |
OSI 7계층 (0) | 2017.07.23 |