[네트워크] 9차시 - 전송계층(2)
2023. 4. 18. 20:00ㆍCS/네트워크
728x90
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
TCP 및 UDP 구조를 배운다.
1. TCP vs UDP
2. TCP
- Reliable Network: 패킷의 유실이 없고, 순서가 보장된다.
- 내용 변조 탐지 기능: (보안 관련이 아니라) 노이즈와 잡음으로 패킷의 내용이 바뀌는 것을 탐지하는 것이 가능
- 혼잡제어: 네트워크가 혼잡이 심한 것 같으면 패킷을 보내지 않고 기다렸다가 추후에 보내는 것
- 흐름제어: 패킷을 수신하는 쪽에도 버퍼가 있고, 수신하는 쪽의 버퍼가 꽉 찬 경우 송신 측에 패킷을 더 보내지 말라고 하는 것
- 포트(사서함) 개념 지원: 하나의 기계(IP 주소) 안에서 여러 개의 응용을 구분
2-1. 통신할 때 패킷들이 어떻게 구성되는지
2-2. TCP 헤더
- Binary 형태의 구조
- 몇 번째 바이트는 어떤 의미를 가지는지가 고정
- Source Port Number, Department Port Number
- Sequence Number(Byte)
- Ack Number(Byte)
- 길이 정보, 플래그, receive window
- checksum
2-3. 소켓 vs 포트
- 소켓 여러개가 하나의 포트 번호에 연결될 수 있다. 다대일 관계
- 예) 웹서버 응용 80번 포트에 1개에 여러 개의 클라이언트가 접속할 때 여러 개의 소켓을 사용한다.
- 클라이언트는 동일한 서버의 동일한 포트에 접근하지만 응용 프로그램 안에 있는 소켓 객체는 서로 다른 소켓 객체를 담당. 즉, 포트는 하나지만 그 포트를 사용하고 있는 소켓은 서로 다른 소켓을 사용
⇒ 웹서버 안에서는 동일한 80번 포트로 들어오는 각각의 클라이언트를 구분할 방법이 필요: TCP 헤더 안에 있는 Source Port Number과 Destination Port Number- Src IP, Det IP, Src Port Num, Det Port Num 네 가지로 어느 소켓에 해당하는 패킷인지 판단하는 기준 근거로 삼아 동일한 포트로 들어오는 연결이라 할지라도 각각의 소켓으로 넘겨주는 방법론
2-4. Sequence Number(Byte)과 Ack Number(Byte)
- 패킷에 Sequence Number을 붙여서 보내면 Ack Number를 보내주는데
- TCP에서는 Sequence Number와 Ack Number가 같은 패킷에 적힘
- Sequence Number와 Ack Number는 패킷의 번호였는데
- Sequence Number와 Ack Number는 몇 번째 Byte인가에 해당하는 Byte 번호
- 패킷마다 번호를 붙이는 것이 아니라 Byte마다 번호를 붙여 통신
- packet과 세그먼트
- packet은 그 자체로 의미 있는 내용의 덩어리, 단위로서의 가치를 가짐
- 단위로서의 가치를 가지지 않는 개념: 세그먼트(TCP를 세그먼트라 부름)
- TCP안에는 아무런 내용이 없는 문자열도 존재할 수 있다.
- TCP 계층에서 “Hello”를 응용 계층으로 올려 보내고 응용계층에서 “Hi”를 내려보낼 때
- 응용 계층에서 무언가를 가공해서 “Hi”를 연산하는데 지연시간
- “Hi”가 TCP로 내려올지 안내려올지는 TCP는 모름
- 지연시간 내에 문자열이 내려온다면 네트워크 통신량을 아낄 수 있고
- 지연시간 내에 응용 계층의 답이 없다면 아무런 내용도 담지 않은 Ack를 보낸다.
- TCP가 Go-back-N 기법을 사용한다.
- Go-back-N은 k번째 packet까지 잘 도착했음을 말하고, Selective Repeat은 k번째 packet은 잘 도착했음을 말한다.
- Selective Repeat 기법은 몇 번째 (패킷)을 받았는지에 대해 얘기해야 하지만
- 지금 TCP는 몇 번째 (Byte)를 받을 차례이다를 얘기하고 있는데
- 몇 번을 받았고 몇 번을 못 받았다를 상대방에게 전달할 방법이 없다.
- Go-back-N 기법과 동일하게 연속해서 받는다는 가정을 한다.
2-5. 길이 정보, 플래그, receive window
- 길이정보: 가번젹
- 플래그 정보: 전체 TCP 커넥션을 맺고 끊는 제어 패킷인지 아닌지 등의 정보
- receive window: 수신 가능한 버퍼 크기, 크기가 0이면 송신 쪽에 더 이상 받을 수 없음을 알림(흐름제어)
- TCP는 사실 송신 측과 수신 측이 구분되어 있지는 않지만 편의상 수신과 송신으로 구분할 때
- 송신 측에서 응용계층에서 send() 함수를 통해 전송계층으로 데이터를 내려보내고 전송계층은 network를 통해서 데이터를 수신 측 전송계층으로 보낸다.
- 수신 측 전송계층은 받은 데이터를 버퍼에 쌓아두고 응용계층이 receive() 함수를 호출해야 데이터를 응용계층으로 올려 보낼 수 있다.
- 이때 위쪽 계층에서 아래쪽 계층에게 요청하기 전에, 아래쪽 계층에서 위쪽 계층에게 패킷을 보내주는 경우는 굉장히 드물다.
- receive() 함수를 호출하지 않는 경우 전송계층의 버퍼가 꽉 차서 송신 측의 패킷을 더 이상 받을 수 없어 네트워크가 낭비되는 문제가 발생 - receive window가 이 문제를 해결 ~ 송신 측 전송계층의 버퍼에 데이터를 저장함
- 송신 측의 버퍼도 꽉 차면 송신측의 응용계층에게 에러를 반환해서 응용계층에서 더 이상 데이터를 보내지 않도록 조치를 취한다.
- CheckSum
- CheckSum: 노이즈나 잡음으로 내용이 변조되는 것을 막아줌(고의적인 변조는 X), TCP와 UDP 모두에 존재
- CheckSum 더하기: 2진수 전체를 다 더했을 때 1111…111이 될 수 있도록 조작하는 것, 보수를 더해서 데이터가 변조되지 않았음을 알 수 있다.
3. 혼잡 제어
- 네트워크가 혼잡한 상황을 TCP에서 인지하고 서로 도와가며 네트워크가 너무 혼잡해지지 않도록 제어하는 방법
- 혼잡을 제어할 수 있는 프로토콜을 별도로 설계하지 않으면 병목현상이 심각하게 발생하여 굉장히 많은 양의 재전송 때문에 네트워크의 병목현상이 심화되어 아무도 네트워크를 제대로 사용할 수 없게 된다.
3-1. 혼잡인지
- 네트워크가 혼잡한 경우에만 전송량을 조절하고, 혼잡하지 않다면 수신 측에서 송신 측으로 최대한 많은 데이터를 건네주는 것이 효율이 좋다.
- TCP에서 사용하는 방법 ⇒ AIMD: Additive Increase Multicative Decrease
- 패킷 유실이 발생 → 혼잡 상황 인지 → 패킷 전송률 낮춤(현재 전송률의 절반으로 줄임)
- 패킷 전송 원할(비유실) → 비혼잡 상황 판단 → 패킷 전송률 증가(현재 전송률 + c(상수))
- AIMD: 증가할 때는 선형적으로, 줄일 때는 기하급수적으로
- 패킷이 유실되었는지 유실되지 않았는지를 구별할 때(reliable networking에서)
- 패킷 유실: Ack 신호가 Timeout 내에 오지 않음
- 송신 측에서 보낸 패킷이 수신 측에 가지 않았을 때
- 수신 측에서 패킷을 수신하고 보낸 Ack이 송신 측에 가지 않았을 때
- Timeout이 지나고 Ack이 도착했을 때
- Ack을 받기 위한 Timeout은 너무 길거나 짧아서는 안 된다.
- 너무 길면 재송신 지연
- 너무 짧으면 false alarm 가능성(문제가 없는 데 있다고 판단하는: 패킷이 잘 전송되었는데 전송되지 않았다고 판단할 수 있는 가능성)
- 패킷유실을 결정하는 Timeout = 재전송을 결정하는 Timeout: Retransmission Timeout (RTO)
- RTT(Round Trip Time): 보내고 받을 때까지 걸리는 시간
- RTO = max (RTT의 평균값 + 4 x RTT의 표준편차, 1초)
- 어떻게 평균과 표준편차를 구할 것인가? 네트워크의 상황에 따라 RTT값이 다르기 때문에
[RTT의 평균값 구하기: weighted moving average]
- RTT(n): Roundtrip Time의 n번 째 측정값
- RTT(n) 평균값: n번째 sample 후 판단한 RTT 평균
- (n = 1) RTT(1) 평균값 = RTT(1)
- (n ≥ 1) RTT(n) 평균값 = (1 - α) * RTT(n-1) 평균값 + α * RTT(n)
- (TCP) α = 0.125
- 현재에 가까울수록 가중치가 높음
- 시간에 민감한 평균값을 구하면서도 효율이 좋은 알고리즘
- 패킷 유실: Ack 신호가 Timeout 내에 오지 않음
3-2. 혼잡제어
- 혼잡제어의 기본적인 메커니즘은 AIMD
- Additive Increase
- increase의 단위: MSS(Maximum Segment Size)
- TCP는 byte단위로 통신하기 때문에 세그먼트의 크기에 따라 불가능한 통신이 존재하는 것은 아님
- 세그먼트의 크기는 효율성에 관련이 있을 뿐이기 때문에 장비들이 세그먼트를 더 쪼개지 않도록 만드는 것이 가장 효율적으로 통신하는 방법
- 하나의 RTT가 성공하면 Conjection window를 1 증가시켜 보낼 수 있는 패킷의 수가 증가한다.
- conjection window를 증가시키는 판단을 하는 것은 conjection window를 증가시키자마자 바로 다음에 보내는 패킷이 돌아올 때 다음 conjection window를 판단한다. → RTT를 늘리겠다고 판단한 다음에 동시 전송되는 추가적인 패킷들에 대해서는 conjection window를 판단에 가산하지 않는다. 즉, 라우트 타임 한 번에 CW를 하나만 증가
- increase의 단위: MSS(Maximum Segment Size)
- Multicative Decrease
- 패킷 유실이 네트워크 이상을 반영할 때는 CW(Conjection Window) = 1 MSS로 대폭 줄임
- 패킷 유실 시 CW 크기를 절반으로 줄임(= Fast Recovery)
- 네트워크 이상과 단순 유실의 판단 근거
- 네트워크 이상) 모든 전송 세그먼트가 동시에 유실됨 → 모든 Ack이 도착 X(RTO가 trigger)
- 단순 유실) 유실된 세그먼트 이후에 보낸 다른 세그먼트의 Ack은 도착
- Fast Retransmission: 원래 Retransmission은 Timeout이 발생해야 Retransmission 하는 것이 기본적인 기법이지만, 동일한 sequence number에 대한 ACK이 3번 오면 해당 sequence number에 해당하는 세그먼트가 사라졌다는 것을 알 수 있기 때문에 Retransmission을 빨리한다고 해서 Fast Retransmission이라 함
- cw를 1로 줄이면 다시 원래의 크기로 돌아오는데 시간이 많이 걸리지만 단순 유실은 네트워크가 아주 안 좋지 않다는 것을 가정하고 절반으로만 줄이기 때문에 복구가 훨씬 더 빨리 되기 때문에 Fast Recovery라 함
- Slow Start: 네트워크 이상시 CW를 1로 줄이면 CW 증가가 매우 느린 문제가 생김
- Slow Start Mode에서는 동시 전송되는 추가적인 패킷들이 성공하면 conjection window를 증가시킴
- 예) 기존 CW가 100인 경우 CW = 50이 될 때까지(= 절반이 될 때까지)는 Multiplicative Increase 수행
[복습]
- TCP: 내용의 유실이 없다는 것과 순서를 보장해 주는 전송계층, 고의적 지연이 존재하고, Byte 단위로 전송, 단방향 파이프 2개로 데이터의 흐름이 끊기지 않는 통신형태, 신뢰가 중요
- UDP: 내용의 유실이 있을 수 있고 순서가 보장되지 않는 전송 계층, 고의적 지연이 존재하지 않음, 패킷 단위로 전송하기 때문에 의미적 단위로 유실, 속도가 중요한 통신 형태
- 통신할 때 패킷의 구성: HTML 문서 + 응용(세션, HTTP 헤더) + 전송(TCP 헤더) + 네트워크(IP 헤더) + 링크(이더넷 헤더) + 물리
- 소켓: 클라이언트는 동일한 서버의 동일한 포트에 접근하지만, 응용 프로그램 안에 있는 소켓 객체는 서로 다른 소켓 객체를 담당한다. 즉, 포트는 하나지만 그 포트를 사용하고 있는 소켓은 서로 다른 소켓을 사용한다.
- Source IP, DestinationIP, Source Port Number, Destination Port Number를 보고 어떤 소켓에 해당하는 패킷인지를 판단
- Sequence Number과 Ack Number
- TCP에서는 Sequence Number과 Ack Number를 같은 패킷에 적고, 각 번호는 몇 번째 byte인가에 해당하는 byte 번호
- TCP 계층에서 Ack의 지연 시간을 둠으로서 지연 시간 내에 문자열이 내려온다면 네트워크 통신량을 아낄 수 있고, 지연 시간 내에 응용 계층의 답이 없다면 아무런 내용도 담지 않은 Ack를 보낸다.
- TCP는 Go-back-N 기법을 사용한다.
- receive window: 수신 가능한 버퍼의 크기, 크기가 0이면 송신 쪽에 더 이상 받을 수 없음을 알려 흐름제어를 함
- 혼잡제어: 혼잡을 제어할 수 있는 프로토콜을 별도로 설계하지 않으면 병목 현상이 심각하게 발생하여 굉장히 많은 양의 재전송 때문에 네트워크의 병목현상이 심화되어 아무도 네트워크를 제대로 사용할 수 없다.
- 혼잡인지: AIMD(증가할 때는 선형적으로 줄일 때는 기하급수적으로)
- 패킷 유실이 발생하면 혼잡 상황을 인지하고 패킷 전송률을 절반으로 낮춤
- 패킷 전송이 원활하면 비혼잡 상황이기 때문에 패킷 전송률을 상수만큼 증가
- RTO(Retransmission Timeout) = max(RTT의 평균값 + 4*RTT의 표준 편차, 1초)
- RTT의 평균값 구하기: weighted moving average: (n ≥ 1) RTT(n) 평균값 = (1 - α) * RTT(n-1) 평균값 + α * RTT(n), 현재에 가까울수록 가중치가 높은 방법
- 혼잡제어
- Additive increase: 하나의 RTT가 성공하면 Conjection window를 1 증가시켜 보낼 수 있는 패킷의 수가 증가한다. 동시 전송되는 추가적인 패킷들에 대해서는 가산하지 않음
- Multicative Decrease: 일반 패킷 유실 시 cw의 크기를 절반으로 줄이고, 네트워크 이상으로 패킷을 유실하면 cw = 1 mss로 대폭 줄임
- slow start: 네트워크 이상시 cw=1로 대폭 줄이면 cw증가가 매우 느리기 때문에 동시 전송되는 추가적인 패킷들로 cw를 증가시킴
한국항공대학교 김철기 교수님의 [컴퓨터 네트워크] 강의 정리입니다. 감사합니다.
http://www.kocw.net/home/cview.do?lid=fc9b366e202ec7e8
http://www.kocw.net/home/cview.do?lid=fc9b366e202ec7e8
728x90
'CS > 네트워크' 카테고리의 다른 글
[네트워크] 11차시 - 네트워크계층(1) (0) | 2023.04.25 |
---|---|
[네트워크] 전송계층 복습 및 정리 (1) | 2023.04.18 |
[네트워크] 8차시 - 전송계층(1) (0) | 2023.04.18 |
[네트워크] 응용계층 복습 및 정리 (0) | 2023.04.18 |
[네트워크] 7차시 - 응용계층(4) (0) | 2023.03.15 |