02-2. Transmission Control Protocol (TCP)

다나·2022년 12월 20일
0

컴퓨터 네트워크

목록 보기
3/6
post-thumbnail

TCP 다음 글은 컴퓨터 네트워크 실습 관련 소켓 프로그래밍 관련 글입니다🧐
TCP 이론이 토대가 되어서 실습 관련 글이 진행되니, 이론부분도 많은 참고바랍니다~!!
(소근소근) 오늘 글은 많이 길어서 마음 단단히 하고 읽어주세요🙇🏻‍♀️

1. Silly window Syndrome 🖼️

  • Header에 비해 보낸 데이터의 크기가 작아서 overhead가 생기는 현상

1) 송신측 : 송신 application 측에서 조금씩 보내서, 수신 측에 채워지는 속도가 너무 느린 경우

해결책 1 : Nagle 알고리즘

  • 보낼 데이터가 MMS(최대 segment의 크기)만큼 쌓이면, 무조건 보낸다.
  • 그러나, 보낼 데이터가 MMS보다 작을 경우에는 이전에 보낸 데이터에 대한 ACK가 오기를 기다리고 데이터를 쌓아서 한꺼번에 보낸다.

2) 수신측 : 수신 application 측에서 조금씩 가져가서, 수신 측에 비워지는 속도가 너무 느린 경우

해결책 1 : Clark 해결책

  • 수신 측의 window size가 작은 경우, sender에게 rwnd = 0의 정보를 담은 데이터를 보낸다.
  • 해당 데이터를 받은 sender는 수신 측에게 전송을 멈춘다.
  • 수신 측은 MMS만큼 비워지거나, buffer의 반이 비워지면, rwnd = k의 정보를 담은 데이터를 sender에게 보낸다.

해결책 2 : 확인 응답의 지연

  • 수신 측의 window size가 일정 크기 빌때까지, sender에게 ACK을 보내지 않는다.
  • sender가 ACK을 받지 못하면 바로 전송을 멈추지 않고, window가 움직이지 않으므로 window size만큼 다 보내고 sender는 전송을 멈춘다.

2. SYN Flooding 👻

Dos 공격 : 연결 요청 큐를 꽉 채워 다른 SYN을 받지 못하게 하는 방식

  • 즉, 인위적으로 header를 수정하여 server에게 보내기 때문에, 서버는 SYN을 받고 SYN+ACK을 보내지만 이에 대한 ACK을 보내는 client가 없어서 서버는 연결하지 못하고, 연결하려고 하는 client 정보가 계속 연결 요청 큐에 남아 있어서 큐가 꽉 차면 다른 SYN이 오지 못한다.

DDos : Dos 공격을 한 사람이 분산시켜 보내는 공격 방법

3. ACK segment, Data 도착 순서 🚃

1) ACK segment

  • sequence number를 사용하지 않음.
  • Ack에 대한 Ack은 없다. (따라서, ACK을 상대방이 잘 받았는지 확인하지 않는다.)

2) Data 도착 순서

  • 데이터는 순서대로 도착하지 않는다. (데이터 이동 경로가 다를 수 있기 때문에)
  • 그러나, TCP는 Application으로 올려보낼 때에는 순서대로 데이터를 올려보낸다.

4. Error Control 💊

4-1. Normal Operation : Overhead를 줄이기 위해서 Ack의 수를 줄이는 방법

1) Rule 1 : 데이터를 받고 Ack를 보낼 때, 보낼 데이터가 있으면 데이터와 ACK을 같이 보낸다.
2) Rule 2 : 데이터를 받고 Ack를 보낼 때, 보낼 데이터가 없으면 약 50ms를 기다리다가 Ack를 보낸다.
3) Rule 3 : 약 50ms를 기다리다가, 2개의 Packet마다 1개의 packet을 보낸다.

4-2. Lost Segment : packet loss로 문제가 생긴 경우

1) Rule 4 : Packet lost로 packet 순서가 바뀌어 들어오면, 바로 ACK를 보낸다.
2) Rule 5 : 못 받았던 데이터가 들어오면, 바로 ACK를 보낸다.

4-3. Lost Acknowledgment : Ack loss로 문제가 생긴 경우

1) Rule 6 : 중복된 packet을 받은 경우(Ack가 사라져서 같은 데이터가 온 경우)에는 바로 ACK을 보낸다.

  • rwnd = 0를 보낸 후에 rwnd = k를 보내는 Ack이 사라진 경우, client(보내는 쪽)는 rwnd = k를 받을 때까지 대기하고, server(받는 쪽)는 데이터를 받기를 기다리므로 deadlock이 발생할 수 있다.
  • 따라서, 이를 해결하기 위해서 Persistence Timer(영속 타이머)가 만료되면 client(보내는 쪽)에서 probe segment를 전송하여 server(받는 쪽)에서 데이터를 받을 수 있는 지 확인한다.

4-4. Fast Retransmission

  • 송신자가 3개의 중복된 ACK을 받으면, 해당 패킷을 packet loss로 간주하고 Time out까지 기다리지 않고 재전송한다.

5. Congestion Control : 혼잡제어 🚦

이때, 혼잡은 들어오는 데이터의 양(Input)이 나가는 데이터의 양(Output)보다 많은 경우를 의미한다.

  • Buffer에 채우다가 못 들어가는 데이터들은 버린다. (이때, packet loss가 발생한다.)

해결책 1) Slow Start : exponential increase 2배씩 증가

  • 기존에는 한꺼번에 모든 데이터를 보냈지만, 2배씩 증가시키면서 데이터의 양을 보내기 때문에 기존보다 느려져서 slow start라고 이야기한다.
  • Threshold에 도달하기 전에 cwnd 2배씩 증가한다.
  • 1초마다 증가하는 것이 아니라, RTT마다 증가한다.

해결책 2) Congestion Avoidance : Additive increase 점진적으로 증가(1씩 증가)

  • 1초마다 증가하는 것이 아니라, RTT마다 증가한다.
  • cwnd는 혼잡이 발생하기 전까지는 점진적으로 증가한다.

6. TCP Timer의 종류 🕰️

1) Retransmission Timer(RTO)

  • Time-out 결정시, Packet을 보내고 Timer를 켠다.

2) Persistance Timer : 영속 타이머

  • rwnd = 0을 받으면, 교착 상태를 해결하기 위해서 Timer를 켠다.
  • 영속 타이머 종료시, probe segment를 전송한다.

3) Keepalive Timer

  • 오랜 시간 동안 idle 상태에 있는 것을 방지한다.
  • 서버가 약 2시간 동안, 클라이언트로부터 세그먼트를 전송받지 못하면 probe segment를 전송한다.

4) Time-wait Timer

  • 2MSL Timer

7. RTT 계산하는 방법 🧮

7-1. Smoothed RTT (RTTs)

1) 처음 : 아무값도 설정하지 않는다.
2) 첫번째 측정 이후 : RTTs = RTTm
3) 그 이후의 측정 후 : RTTs = (1-α)RTTs + αRTTm
(이때, α = 1/8 로 설정하며, RTTs는 바로 전의 RTT 평균이고, RTTm은 현재 측정한 RTT이다.)

7-2. RTT Deviation (RTTd)

1) 처음 : 아무값도 설정하지 않는다.
2) 첫번째 측정 이후 : RTTd = RTTm / 2
3) 그 이후의 측정 후 : RTTd = (1-β)RTTd + β |RTTs - RTTm|
(이때, β는 1/4로 설정하며, RTTd는 바로 전의 RTT 편차이고, RTTm은 현재 측정한 RTT이다.)

7-3. RTO

1) 처음 : 초기값
2) 그 이후의 측정 후 : RTO = RTTs + 4*RTTd

8. Karn's Algorithm 💼

  • 재전송했던 segment의 RTT를 갱신하지 않는다.
    이유 : 같은 segment를 두 번 전송하고 하나의 ACK을 받은 경우, 원래 segment에 대한 ACK인지 아니면 재전송한 segment에 대한 ACK인지에 대한 여부 판단이 모호하다. 따라서 다른 새로운 segment를 전송하고, 그에 대한 ACK을 받을 때에만 RTT를 갱신한다.

9. Options 🍽️

9-1. End of option (EOP) : 뒤에 0으로 채운다.

  • 맨 마지막의 option 뒤에 1번만 사용가능하며, EOP option 뒤에는 header가 끝나고 바로 data가 온다.

9-2. No operation (NOP) : 앞에 0으로 채운다.

  • option의 앞에 사용 가능하며, option마다 사용할 수 있다.

9-3. Maximum Segment Size (MSS)

  • 연결 setup 과정에서 receiver가 sender에게 보낼 header의 option에 받고 싶은 MSS를 작성한다.

9-4. Window Scale Factor

  • rwnd를 늘리고 싶은 경우에만 해당 option을 사용한다.
  • 연결 setup 과정에서만 사용하여 rwnd를 결정할 수 있다.

9-5. Timestamp : RTT(Round Trip Time) 측정시 사용

  • PAWS (Protection Against Wrapped Sequence Number)dmㄹ 위해서 사용되기도 한다. (sequencer 번호가 동일해도 출발시간으로 해당 packet을 구분할 수 있다.)

9-6. SACK Permitted Option

  • SACK option을 사용할지 말지에 대한 여부를 작성한다.
  • SACK option은 연결 setup과정에서만 사용여부를 결정할 수 있다.
profile
컴퓨터공학과 학생이며, 백엔드 개발자입니다🐰

0개의 댓글