jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon

시크릿주주

Network :: TCP
💼 CS/📶 Network

Network :: TCP

2022. 12. 9. 15:47
반응형

TCP


특징

  • point-to-point : 1대1 연결
  • reliable, in-order byte stream : 신뢰성 있는 연결, 순서를 가진 데이터 전송
  • pipelined : stop-and-wait 하지 않게 데이터를 전송
    이 방식은 congestion control 과 flow control 이 같이 동반되어야 함 !
  • full duplex data : 양방향으로 데이터를 주고 받을 수 있음
    • MSS : maximum segment size
  • connection-oriented : 연결 지향
    • handshaking
  • flow controlled : 수신자가 받을 수 있는 용량을 송신자가 고려함

 

헤더 구조


  • source port / dest port : 각 2bytes
  • sequence number : 4bytes. 송신자 측 시퀀스 번호
  • acknowledgement number : 4bytes. 수신자 측 받은 시퀀스에 대한 ack 번호
sequence number 가 100 인 패킷을 받으면 수신자가 ack number 에 100을 넣어서
패킷을 보낼 것 같지만 실제로는 ack number 에 101 을 담아서 보낸다 !
수신자가 다음 받고 싶은 번호를 넣어서 보낸다고 생각하면 됨
  • FLAG : 8bits
    0 또는 1 로 세팅되어 있음.
    • FIN : 1이면 연결 종료
    • SYN : 1이면 연결 set
    • RST : 1이면 연결을 다시 시도
    • PSH : 1이면 받은 data 를 가능한 한 빠르게 위로 올려줌 (잘 안 쓰임)
    • ACK : 1이면 ACK 패킷. ack number 를 확인하라는 뜻!
    • URG : 1이면 PSH 와 비슷, Urg data pointer 가 가리키는 데이터가 중요하다는 뜻 (잘 안 쓰임)
    • ECE : (Explicit Congestion Notification Echo) 1이면 혼잡상황.
    • CWR : (Congestion Window Reduced) 1이면 혼잡한 상황이기 때문에 window size 를 줄이라는 뜻.

Sequence Number 와 ACK Number 가 헷갈릴 수 있는데

아래 예제만 잘 기억하자 !

 

 

RTT 계산하기

timeout 이 나는 시간을 어떻게 계산해야 할까 ?

timeout 이 너무 짧으면 premature timeout, 즉 불필요한 재전송이 일어날 수 있고,

너무 길면 segment loss 에 너무 느리게 대응하게 된다.

→ 아래 수식을 이용해서 RTT 를 계산해낸다.

 

 

  • 구한 RTT 를 이용해서 timeout interval 계산하기

 

 

Reliable Data Transfer


TCP 는 reliable 하게 데이터를 전송하기 위해

  • pipelined segments
  • cumulative acks
  • single retransmission timer
오 cumulative acks 방식이니까 go-Back-N 방식 ?
TCP 는 cumulative ack 방식만 사용하고 실제 재전송은 Selective repeat 방식 !
효율적인 방식으로 섞어서 사용한다.

Sender Events

application layer 에서 데이터 받기

  • Seq number 붙여서 segment 만들기
  • byte-stream 으로 만들어서 전송하기
  • timer 시작하기 (timeout 담당)

timeout

  • timeout 발생 시 segment 재전송
  • timer 재시작

ack 받기

 

재전송 시나리오

 

100번 ACK 이 loss 되었어도 120 ACK 이 도착했다면 ACK 100 도 잘 도착했다고 간주하자

→ cumulative ACK

Fast Retransmit

 

timeout 이 나기전 3번 연속 동일한 ACK 이 오면 못 받은 것으로 간주하고 재전송 !

→ triple duplicate ACKs

 

3-way Handshake (SYN)


과정

  1. SYN bit 를 1로 설정하고 Seq num 을 설정해서 연결 요청 전송
  2. 받은 Seq num 에다 1 을 더해 ACK num 에 담기
    Seq num 을 설정하고 SYN 과 ACK bit 각각 1로 설정해서 응답 전송
  3. 받은 Seq num 에다 1 을 더해 ACK num 에 담고
    ACK bit 를 1로 설정해서 응답 전송

 

728x90
반응형
저작자표시 (새창열림)
    '💼 CS/📶 Network' 카테고리의 다른 글
    • JWT가 뭔데요?
    • Network :: Flow Control & Congestion Control
    • Network :: UDP
    • Network :: Pipelined protocol
    jujuwon
    jujuwon

    티스토리툴바