→ Open in Slid

  • 본 글은 이전에 사용하던 영상 강의 필기 앱인 'Slid'에서 필기 했던 내용을 Velog로 옮긴 내용입니다.
  • 본 글은 이화여대 이미정교수님 2014학년도 1학기 컴퓨터 네트워크 강의를 기반으로 작성되었습니다.
  • 강의 링크 : http://www.kocw.net/home/search/kemView.do?kemId=1046412

Connection-oriented demux

  • TCP의 경우 연결을 맺는데 사용되는 Door Socket이 있고 커넥션 별로 소켓이 따로 있다.
  • 따라서 한 프로세스가 커넥션 마다 소켓 하나씩을 가지므로 여러개의 소켓을 가질 수 있다.(각 클라이언트를 응대하기 위해)

따라서 demux를 위해선 목적지 프로세스와, 출발지 프로세스에 대한 정보가 필요하다.

  • 목적지 프로세스 구분을 위해 : 목적지 IP, 포트번호
  • 출발지 프로세스 구분을 위해 : 출발지 IP, 포트번호
  • 따라서 TCP는 총 네개의 정보가 필요하다.

UDP : User Datagram Protocol

  • UDP 프로토콜의 특징
  • 연결을 맺지 않는, Connection Less Protocol이다.
  • 신뢰성이 낮고 (Unreliable), 순서를 맞춰서 전송해주지 않는다 (Unordered)
  • 체크섬 기능으로 오류가 발생했는지 안했는지만 알려준다.
  • 거의 기능이 없는 가장 기본적인 프로토콜이다.
  • 왜 사용할까?
  • Best Effort : Congestion Control 없이 일단 보낸다.
  • Pure (No frils)하다.
  • 그러므로 전송 오버헤드가 없다.
  • 어디에 사용할까?
  • 스트리밍 : Data Integrity보단 처리량이 중요하므로 Best Effort로 전송하는 UDP를 사용한다. 이론적으론 그렇지만 실제로는 TCP를 많이 사용한다.
  • DNS : 일회성 질의이므로 굳이 커넥션을 맺을 필요가 없다.
  • SNMP : SNMP는 네트워크 관리 프로토콜이다. 정기적으로 최신정보를 업데이트하므로 Data Integrity가 중요하지 않다.
  • 신뢰성이 매우 중요한 경우 : 신뢰성이 매우 중요한 경우에는 reliability를 애플리케이션 계층에서 확인하므로 TCP가 필요없다.
  • Http 3.0은 TCP 오버헤드를 줄이기 위해 UDP를 사용한다.  //3/28(일)까지 수강한 내용

신뢰성있는 데이터 전송의 원리

신뢰성 있는(Reliable) 데이터 전송을 위해선 다음과 같은 기능이 필요하다.

  • Checksum : 체크섬 비트를 둬서 데이터에 오류가 있는지 검사하는 방법(신뢰성 보장 1)
  • Ack : Acknowledge, 잘 받았다는 확인 응답(신뢰성 보장 2)
  • N-Ack : Negative Acknowledge, 잘못 받았다는 확인 응답, 웹에서는 사용하지 않는다.
  • Timer : Ack(or N-ack) 를 무한정 기다릴 수 없으므로 타이머를 둔다.(신뢰성 보장 3)
  • Window Pipelining : 데이터 전송과 수신을 비동기식으로 처리하기 위한 Window다. 쉽게 얘기하자면 데이터를 주고-받고-주고-받고가 아니라 주고 주고 주고 받고 주고 받고 받고 식으로 통신한다는 것이다.
  • Sequence Number : 순서에 맞는 데이터 전송을 위한 순서 정보다. 포트를 재사용할 수 있으므로 통신 시작 시  랜덤한 Sequence 동기화하는 과정을 거친다. (SYN 플래그를 사용한다.)(신뢰성 보장 4)

TCP

TCP는 메세지를 임시 저장소인 버퍼에 담아서 Flow Control, Congestion Control에 의해 제어되는 속도로 버퍼에 있는 메세지를 전송한다.

  • 버퍼 담는다는 것에 주목해보자.
  • TCP는 잠시 버퍼에 담았다가 전송한다.
  • 버퍼로 인해 메모리에 부담이 커질 수 있다.
  • 잠시 담았다가 전송하므로 Throughput 성능이 떨어진다.
  • Flow Control이란?
  • 수신측에도 TCP 버퍼가 있다.
  • 수신 측 TCP 버퍼가 가득 차도록 송신 측에서 빨리 전송하면 어떻게 될까?
  • 메시지는 기껏 거의 다 와서 유실된다.
  • 커넥션을 맺을 때 / 서로 통신할 때 자신의 남은 버퍼 크기를 전송해서
  • 그 크기만큼 보내지 않도록 조정한다.
  • Congestion Control이란?
  • 라우터에도 버퍼가 있다.
  • 라우터 버퍼가 가득 차면 메시지가 유실되어 수신 측에서 ACK가 오지 않을 것이다.
  • ACK가 오지 않으면 중간 라우터에서 데이터 Loss가 생긴 것 (== Congestion 발생)으로 인식하고
  • 데이터 보내는 속도를 줄인다.

TCP의 특징과 원리

  • 제공하는 기능들
  • Point to Point (일대일) 연결이다.
  • Reliable, In-Order bytestream이다.
  • Pipelined(신뢰성을 보장해준다) 되어있다.
  • Full Duplex (동시 양방향 통신)이다.
  • Connection Oriented 통신(handshaking필요)이다.
  • Flow, Congestion Control을 제공한다.

TCP Segment

컴퓨터 네트워크 10강 image

TCP segment 구조는 위에 보이는 것과 같이 고정(fixed)파트, 가변(variable)파트 두 개로 나뉜다.

출처 : https://www.slideserve.com/redford/the-tcp-segment-header

  • TCP 세그먼트의 헤더는 기본 4바이트 5줄(20byte=고정헤더길이) + Options(가변헤더길이=알 수 없다)으로 구성되어있다.
  • 따라서 TCP 세그먼트의 크기는 20byte + a 이다.
  • Src 포트와 Dest포트만 있다. IP 주소는 네트워크 계층 헤더에 있다.
  • Sequence Number : TCP는 Inorder 전송을 위해 데이터에 순서 번호를 붙여서 전송한다.
  • Acknowledgement Number : ACK == 100이면 99까지 데이터를 받았고 100번 데이터를 전송해달라는 것이다. TCP는 누적 ACK를 사용한다. (상대방이 나한테 보낸 데이터에 대한!)
  • TCP Header Length : Optional 필드가 있으므로 어디까지가 헤더인지 알아야 한다.
  • TCP Control FlagsURG
  • URG : 급한 데이터가 있음을 나타낸다. Urgent Pointer에 값이 있음을 의미.
  • ACK : 1로 세팅되면 ACK에 값이 유효함을 의미한다.
  • PSH : PUSH, 버퍼링 된 데이터를 상위 계층으로 즉시 전송할 것을 의미한다.
  • RST : 연결 리셋 시 사용되는 플래그이다.
  • SYN : 연결 시작 시 송수신 번호 동기화를 위해 사용된다.
  • FIN : 연결 종료를 나타내는 플래그이다.
  • Window Size : ACK를 받지 않아도 전송 가능한 세그먼트의 양이다Congestion Control을 위한 CWND와 Flow Control를 위한 RWND 중 작은 값을 선택한다.
  • CWND : Congestion Window. rwnd를 무시할 때 송신 측이 Ack 없이 한 번에 데이터를 보낼 수 있는 크기이다. 작은 값에서 시작해서 점점 늘려나가다 네트워크 상에서 Loss가 일어나면, 즉 중간의 라우터에서 Congestion이 발생해 패킷이 유실되면 CWND를 줄인다.
  • RWND : Receiving Window, 수신 측 TCP 버퍼 여유공간의 크기이다. 여유공간의 크기 이상으로 ACK 없이 데이터를 전송하면 수신 측 버퍼가 가득 찰 수 있으므로 Window는 RWND 보다 작아야 한다.

TCP Time-out

  • 어느 정도 시간이 흐른 뒤에도 ACK가 오지 않으면 Loss가 발생했다고 판단할 수 있을까?
  • Time-out 시간이 너무 짧으면 불필요한 재전송이 많을 것이고 너무 길면 Loss가 일어나도 재전송까지 시간이 오래 걸릴 것이다.
  • Time-out시간은 RTT를 이용해서 판단한다.
  • 일정 시간 동안의 RTT 값의 가중평균에 Safety Margin을 더해서 Time-out Interval을 정한다.(일반적으로 DevRTT의 4배를 safetyMargin으로 정한다.)
  • Time-out Interval \= EstimatedRTT + 4*DevRTT(=safety margin)
  • 일반적으로 a = 0.125, b = 0.25를 사용한다.
  • 최근 추정 값의 오차가 커지면 Interval의 값이 커진다.
  • Interval은 RTT값이 크게 변해도 가중 평균되기 때문에 완만한 그래프를 그린다.
  • Time-out  Interval (RTO)를 측정하는 방법은 여러 가지가 있다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN