회귀분석(회귀  이론을 기초로 독립변수가 종속변수에 미치는 영향을 파악하여 예측모형을 도출하는 통계적 방법)의 시초는 아버지와 아들의 키 연관성 연구에서 부터 시작됌

아들의 키가 아버지의 키 수준으로 얼마나 회귀하는지 찾기 위한 연구

 

독립변수: 어떠한 현상을 설명할때 현상의 발생에 영향을 미치는 요인

종속변수: 독립변수의 영향에 따라 결정되는 요인

예측모형: 독립변수와 종속변수에 해당하는 자료를 모아 관계를 분석하고, 이를 예측할수있는 통게적 방법으로 정리한것

 

식사량 운동량 수면시간은 독립변수이고

체중감소량은 종속변수이다

 

회귀식 : 독립변수와 종속변수 사이의 관계를 수학식으로 표현 
단순회귀 : 독립변수의 1개인 경우
다중회귀 : 독립변수가 2개 이상인 경우
로지스틱 회귀 : 종속변수의 값의 형태가 연속형 숫자가 아닌 범주형 값인 경우, 이를
분석하기 위해 사용하는 통계적 방법
분류 : 데이터로부터 어떠한 범주를 예측하는 작업

 

 

단순회귀분석 개념
독립변수(x)와 종속변수(y) 사이의 선형관계를 파악하여 예측에 활용하는 통계적 방법 
독립변수와 종속변수에 대해 수집한 데이터를 활용하여, 인과관계를 가장 잘 설명하는
w와 b를 찾는 게 단순회귀분석의 목표

단순회귀식 
y=wx + b (w, b는 상수)
x -> 독립변수(영향을 주는 값) 
y -> 종속변수(영향을 받는 값) 
w -> 단순회귀선의 기울기
b -> 단순회귀선의 절편(y축과 단순회귀선이 닿는 지점)

w의 값에따라서 기울기가 달라짐

 

(기존 mtcars 데이터를 통해, 차량 중량을 바탕으로 연비를 예측하는 모형 만들기)

data(mtcars) 
plot(mpg~wt, data = mtcars)  #차량 중량(x)과 연비(y) 간의 산점도를 통해 선형관계 확인
model <- lm(mpg~wt, mtcars) #회귀모형 생성하기 
abline(model)  #회귀선을 산점도 위에 표시
coef(model)[1] # 회귀결과 추출 : b값을 출력(37.28) 
coef(model)[2]  # 회귀결과 추출 : w값을 출력(-5.34)

차량중량 – 연비 단순회귀분석 회귀식
𝑚𝑝𝑔 = −5.34 ∗𝑤𝑡+37.28

 

(새로운 차량 중량 값을 대입하여, 연비 값을 예측해보기)

b <- coef(model)[1]  #b값 대입 
w <- coef(model)[2]  #w값 대입 
wtSample <- 3.8  #예측하고자 하는 독립변수 대입
equation <- w * wtSample + b  #회귀식 만들기 
print(equation)  #회귀식에 독립변수 대입한 결과 출력

 

회귀 모형 오차구하기

회귀모형의 예측값과 실제값의 차이

wtData <- mtcars[,"wt"]  #전체 차량 중량 데이터 선택
mpgPred <- w * wtData + b  #wtData를 회귀선에 대입하여 전체 차량 연비 예측값 도출 
mpgData <- mtcars[, "mpg"]  #전체 차량 연비 데이터 선택
compare <- data.frame(mpgPred, mpgData, mpgPred – mpgData)
#차량 연비 예측값, 차량 연비 실제값, 예측값과 실제값 간의 차이 계산값을 담은 데이터프레임 생성 
colnames(compare) <- c("예상", "실제", "오차")  #데이터프레임 열 이름 재정의 
head(compare)

 

다중회귀분석: 여러 개의 독립변수(x)와 종속변수(y) 사이의 선형관계를 파악하여, 예측에 활용하는
통계적 방법

y=w1x1 + w2x2 + w3x3 + … wnxn +b (w, b는 상수)
x-> 독립변수(영향을 주는 값) 
y-> 종속변수(영향을 받는 값) 
 w-> 회귀계수(회귀선의 기울기)
b-> 회귀상수(y축과 회귀선이 닿는 지점)

 

다중회귀분석의 주의사항!

독립변수와 종속변수간의 높은 상관관계

선택한 독립변수간에는 서로 낮은 상관관계를 보여야함 (다중공선성 문제가 발생가능)

독립변수 개수는 적을수록 유리

 

다중공선성은 독립변수들이 서로간에 강한 상관관계가 있어 상호 영햐을 줘서 종속변수 예측 값에 부정적인 영향을 주는 현상을 말함 -> 종속변수 추정에 오류를 발생시킬수있음

 

다중회귀분석

data(mtcars)
colnames(데이터프레임) <- c(“”, “”, “”,…)
• 데이터프레임 열 명칭 재설정
df <- data.frame(mtcars$wt, mtcars$disp, mtcars$hp) 
#독립변수 데이터들을 바탕으로 DF 생성
colnames(df) <- c("중량", "배기량", "마력")  #DF 열 명칭 재설정
plot(df, pch = 16, col = "blue", main = "산점도 매트릭스")  #3:3 산점도 매트릭스 그리기
model <- lm(mpg ~ wt + disp + hp, data = mtcars)  #다중회귀분석 예측모형 만들기 
summary(model)  #예측모형 결과 도출

R-square는 다중선형회귀모형이 mpg를 얼마나 잘 설명하는지 나타냄. 0.65 이상이면 잘 설명하는 것으로 간주함.

stepAIC() 함수를 통해 유의미한 독립변수 만으로 회귀모형을 만드는 변수선택을 진행하여, 새로운 회귀모형을 만들고 최종 회귀식 도출

 

요약정리

 

회귀분석 이해
– 독립변수 / 종속 변수 / 예측모형 
– 단순회귀 / 다중회귀

 

lm() 함수
– 회귀분석에 필수적인 함수
– lm(formula, data) / lm(y축 변수~x축 변수, 데이터프레임)

 

단순회귀분석
– 독립변수(x)와 종속변수(y) 사이의 선형관계를 파악하여 예측에 활용하는 통계적 방법 
– y=wx + b (w, b는 상수)
data(데이터프레임) 
plot(y축 변수~x축 변수, data=데이터프레임) 
lm(y축 변수~x축 변수, 데이터프레임) 
abline(회귀식l) 
coef(회귀식) [1] b값 출력 [2] w값 출력

 

다중회귀분석
– 여러 개의 독립변수(x)와 종속변수(y) 사이의 선형관계를 파악하여,예측에 활용하는 통계적 방법 
– y=w1x1+ w2x2+ w3x3+ …wnxn+b (w, b는 상수)
data(데이터프레임) 
data.frame(데이터프레임$변수1, 데이터프레임$변수2, 데이터프레임$변수3) 
colnames(뉴데이터프레임) <- c(변경할 문구)
lm(y축 변수~x축 변수1+x축 변수2+x축 변수3+...,, 데이터프레임) 
library(MASS) 
stepAIC(회귀식) 
summary(회귀모델) 

'빅데이터' 카테고리의 다른 글

R텍스트 마이닝  (0) 2022.12.05
데이터 시각화  (0) 2022.12.04
다중변수 자료  (0) 2022.12.04
데이터 구조파악  (0) 2022.12.03

다중변수 자료 탐색에는 산점도와 상관분석이있다.

산점도(scatter plot)는 2개의 변수로 구성된 자료의 분포를 알아보는 그래프, 관측단위별 값들의 분포를 통해서 2개의 변수 사이의 관계를 파악하는 것이다. 

산점도 그리는법

print(mtcars) 
wt <- mtcars$wt 
mpg <- mtcars$mpg 
plot(wt, mpg)
data(mtcars) 
wt <- mtcars$wt 
mpg <- mtcars$mpg 
plot(wt, mpg,
# R 제공 mtcars 데이터셋 
# 중량 자료 
# 연비 자료 
# 2개 변수 (x축, y축) 
main = "중량-연비 산점도", # 제목 
xlab = "중량(wt)", 
ylab = "연비(mpg)", 
col = "red", 
pch = 19)


# x축 레이블 
# y축 레이블 
# point 컬러 
# point 종류

산점도로 3개 이상의 변수사이의 관계도 파악 가능

다중산점도 그리는법

vars <- c("mpg", "disp", "drat", "wt")  # 대상 변수 
target <- mtcars[,vars]  # 데이터프레임에서 위의 변수명을 가진 열 선택 
head(target)  # 데이터프레임 확인 
pairs(target, main = "Multi Plots”) # 다중 산점도 생성

 

상관분석은 두 변수간의 관계를 분석하기 위해 사용됨

변수는 연속형 자료만 가능함(저번에 배운 구간척도, 비율척도)

ex) 키의 변화는 몸무게의 변화와 관계가 있는가? 가설: 키가 커지면 몸무게가 늘어난다

 

상관계수 r은 x와 y사 함께 변하는 정도/x와 y가 각각변하는 정도

두 변수간 X와 Y가 완전히 동일하면 상관계수 r은 +1 (양의상관관계)
두 변수간 X와 Y가 반대방향으로 완전히 동일하면 상관계수 r은 -1 (음의 상관관계) 
두 변수간 X와 Y가 상관성이 없으면 상관계수 r은 0

 

 

 

 

 

 

상관분석 

plot() 함수
plot() 함수는 x와 y의 2개 축을 기준으로 좌표를 찍듯이 그리는 컨셉을 
가지는 함수
예시. plot(2,1)
plot() 함수는 산점도(scatter plot)를 그리는 함수 
plot(벡터2(Y)~ 벡터1(X), data=데이터프레임)

 

데이터프레임을 생성하고 산점도
음주정도(beers)에 따라 혈중알코올농도(bal)가 변하는 정도

beers <- c(5, 2, 9, 8, 3, 7, 3, 5, 3, 5)
bal <- c(0.1, 0.03, 0.19, 0.12, 0.04, 0.095, 0.07, 0.06, 0.02, 0.05) 
ca <- data.frame(beers, bal) 
print(ca)
plot(bal~beers, data=ca) # 산점도

lm()함수는 리니어 모델의 약자로 선형모델을 맞추는데 사용

lm()함수는 y=ax+b형태의 1차식이며 두변수의 선형 관계를 가장 잘 나타낼수있는 선의 식을 자동으로 찾는역할을함

adline()함수- 그래프위에 선을 추가하고싶은경우 사용

lm(벡터2~벡터1, data=데이터프레임) # 회귀식 도출 
abline(회귀식) # 회귀선 그리기
camodel <- lm(bal~beers, data=ca) 
abline(camodel)

이런식으로 사용하면 됨,

 

cor()함수 = 상관계수를 구하는 함수

cor(beers,bal)

이런식으로 상관계수를 구함

기본값은 피어슨 상관계수임

 

상관계수 상관관계
± 0.9 이상 상관관계가 아주 높다 
± 0.7 ~ 0.9 상관관계가 높다 
± 0.4 ~ 0.7 상관관계가 있다 
± 0.2 ~ 0.4 상관관계가 있으나 낮다 
± 0.2 미만 상관관계가 거의 없다

 

선그래프

두개의 변수중 하나가 시간을 나타내는 값일때 사용함.

시계열 자료- 시간의 변화에  따라 자료의 증감추이를 확인

 

선그래프를 작성하는 함수는 산점도를 작성할때 사용한 plot()함수인데 여기서 매개변수 type의 값을 l로 하면 선그래프가 작성됨.

month <- 1:12
cold <- c(5,8,7,9,4,6,12,13,8,6,6,4) 
plot(month, # x data 
cold, # y data 
main=“감기 환자 통계”, # 제목 
type=“l”, # 그래프의 종류 선택(알파벳) Line 
lty=1, # 선의 종류(Line Type) 선택 
lwd=1, # 선의 굵기 선택 
xlab=“month”, # x축 레이블 
ylab=“cold patients”) # y축 레이블

 

복수 선그래프를 나타낼때

lines()함수를 이용하면됨 

lines()함수는 좌표의 점들을 이어서 선을 그리는 함수임 plot()함수로 작성한 그래프 위에 선을 겹쳐서 그리는 역할

month <- 1:12
cold1 <- c(5,8,7,9,4,6,12,13,8,6,6,4) 
cold2 <- c(4,6,5,8,7,8,10,11,6,5,7,3) 
plot(month, # x data 
cold1, # y data 
main=“감기 환자 통계”, # 제목 
type=“b”, # 그래프의 종류 선택(알파벳) Line 
lty=1, # 선의 종류(Line Type) 선택 
lwd=1, # 선의 굵기 선택 
col=“red”, # 선의 색 선택(빨강) 
xlab=“month”, # x축 레이블 
ylab=“cold patients” # y축 레이블 
ylim=c(1,15))# y축 값의 (하한, 상한)
lines(month, # x data 
cold2, # y data 
type=“b”, # 선의 종류 선택 
col=“blue”) # 선의 색 선택(파랑)

요약 정리

 

산점도

-plot(x축,y축)

-main/xlab/ylab/col/pch

 

다중산점도

-pairs(target, main = "Multi Plots”)

-target <- 데이터프레임[,vars]

 

상관분석

-연속형 자료로만 가능

-plot()함수 #산점도

-lm(벡터2~벡터1, data=데이터프레임) # 회귀식 도출

-abline(회귀식)#회귀선 그리기

 

상관계수

– r = X와 Y가 함께 변하는 정도
– cor(벡터1,벡터2)  # 상관계수 계산
– r은 +1 (양의상관관계) / R은 -1 (음의 상관관계) / R은 0

 

선그래프

– plot() 함수 # 산점도
– lines() 함수 # plot() 함수로 작성한 그래프 위에 선을 겹쳐서 그리는 역할

'빅데이터' 카테고리의 다른 글

R텍스트 마이닝  (0) 2022.12.05
데이터 시각화  (0) 2022.12.04
회귀분석  (0) 2022.12.04
데이터 구조파악  (0) 2022.12.03

데이터 분석 대상의 자료 특성에 따라 범주형자료와 연속형 자료로 구분

 

범주형 데이터

크기를 갖지 않기때문에 연산 불가능

자료에 포함된 관측값들을 종류별로 세는 것

이를 통해 종류별 비율을 알 수 있고 이결과를 바탕으로 막대 그래프 또는 원그래프등 그릴수있음

table()함수로 벡터 내 범주형 자료의 종류별 도수분포표 계산 가능

table() 함수는 데이터 빈도 분할표를 자동으로 만듬

 

도수분포표 도출하는 코드

도수분포표
univ <- c ("상명대", "대전대", "동의대", "단국대", 
"단국대", "동의대", "우송대", "홍익대", "상명대", 
"원광보건대")
print(univ) #univ 벡터 출력
table(univ) #도수분포표 계산 
table(univ) / length(univ) #비율 출력

table <- table(univ)
barplot(table, main = "재학 대학 분포")

이렇게 막대그래프 그릴수있어열

 

pie(table, main = "재학 대학 분포")

이걸론 원그래프 그릴수있어열

 

 

명목척도: 자료를 이름이나 명칭으로 구분하고 숫자를 부여한 척도 ex) 혈액형

                순서를 매길수 없고, 연산할 수 없음, 단순히 식별을 위해서 숫자를 부여하긴함

서열척도: 개체 간의 특정 속성을 바탕으로 서열 관계를 가지는 척도 ex) 미국이 중국보다  앞서긴하지만 두개를 더할순없                   음 연산 불가!

연속형 데이터

관측값들이 크기를 가지기때문에 범주형 자료에 비해서 다양한 분석 방법이 존재

절사평균: 평균이 자료내에 있는 너뭌 ㅡ거나 작은 관측값에 영향을 받는것을 완화하기 위하여 상하위 20퍼값 제거후 

평균 계산하는것

mean(bmi)  #평균 
median(bmi)  #중앙값 
mean(bmi, trim = 0.2)  #절사평균(상하위 20% 값 제외)

사분위수: 주어진 자료에 값들을 크기순으로 나열했을때 4등분하는 지점에 있는 값들을 의미함

자료의 값을 4등분하면 등분점이 3개가 생기며 각각 1사분위수 2사분위수 3사분위수 라고부름

2사분위수는 중앙값과 동일함 주어진 자료의 값들을 절반으로 나눈 구간이니까

각 구간에는 25퍼의 자료가 존재함 4등분했으니까

bmi <- c(12.1, 12.8, 15, 19, 22, 28, 31.1, 34) 
quantile(bmi)  #사분위수 계산 
summary(bmi)  #요약통계량

산포: 주어진 자료의 값들이 흩어져있는 정보를 의미함.(분산과 표준편차로 파악)

분산과 표준편차가 작다 -> 자료들의 관측값들이 평균값 주변에 모여있다 
분산과 표준편차가 크다 -> 자료들의 관측값들이 평균값에서 멀리 떨어져있다

bmi <- c(12.1, 12.8, 15, 19, 22, 28, 31.1, 34) 
var(bmi)  #분산 
sd(bmi)  #표준편차 
range(bmi)  #값의 범위 
diff(bmi)  #최대값과 최소값 간의 차이

boxplot(bmi)

이걸로 산포를 상자그래프로 나타낼수있음

 

상자그래프 보는법

구간척도: 연속적인 숫자로 수량화 할 수 있으며,그 숫자들간의 간격이 동일함 ex) 서울 기온 23도, 도쿄기온 28도같은것

                수령호 할 수 있기 때문에 몇만큼 크고 작다 표현할수있음, 근데 절대적인 0값을 가지고 없다라고 표현불가

                 ex) 시베리아 기온이 0 도라고하면 없다라고는 말 못함 (0도도 기온이니께) 근데 0도? ㅈㄴ춥겠다 ㄷㄷ

비율척도: 연속적인 숫자로 수량화 할수있으며, 그 숫자들간의 비율이 동일함 대소 비교뿐만 아니라 사칙연산도 가능

                이건 절대적인 0값을 가지고 없다라고 표현할수있음 ex) 만약에 어떤 회사 인원이 0명이면 그 회사에는 인원이                   없다고 할수있음 

 

단일변수 자료: 하나의 변수로만 구성된 자료(벡터가 1개)

다중변수 자료: 두개 이상의 변수로 구성된 자료(벡터가 여러개)

 

 

'빅데이터' 카테고리의 다른 글

R텍스트 마이닝  (0) 2022.12.05
데이터 시각화  (0) 2022.12.04
회귀분석  (0) 2022.12.04
다중변수 자료  (0) 2022.12.04

리액트 프로젝트를 실시할때에는 우선 node.js를 깐 후에 리액트 프로젝트를 실시할수있는 폴더를 만든후에 그 폴더에서 git bash를 통해 vs code를 연다 그 후에 보기에서 터미널을 눌러 열어주고 터미널에 npm init react-app .이라고 쳐준다 그 후에 프로젝트 실행 명령어인 npm run start를 누르면 프로젝트가 웹을 통해 실행되는것을 볼수이떠 그리고 웹을 끄려면 ctrl+c해주면댐

이렇게해서 보라는 버튼을 클릭했을때 곧 도착합니다 라는 경고문을 띄우게 만들수있음 굳굳!!

'REACT' 카테고리의 다른 글

React Foundation  (0) 2023.06.27
REACT  (0) 2023.04.29
useRef  (0) 2022.07.28
React virtual DOM  (0) 2022.07.28
jsx문법  (0) 2022.07.21

TCP는 에러컨트롤 플로우컨트롤 컨제스천 컨트롤 3가지의 컨트롤이있음

CONGESTION CONTROL이란 CWND값을 결정하는 과정임 

첫번째는 네트워크 컨제스천을 감지해야함

두번째는 그걸바탕으로CWND계산해야함

버퍼가 꽉차면 전송된 시그널이 없어지는데 이걸 패킷로스라고함. <-이게 문제야! 목적지까지 너무 오래걸리고 심지어 없어짐.

근데 이걸 어캐 감지함???

크게 3가지 솔루션

1. 컨제스천이 발생하면 딜레이가 됨

2. 더 나아가서는 패킷로스가 일어남 

3. 중간에 있는중계기가 능동적으로 컨제스천이 발생한걸 알려줌(Explict Marks) <- 데이터 패킷에 컨제스천 발생했음이라고 쓰는 방법있음!

근데 이 3번 방법은 tcp에서 사용어려움 why? 앤드 투 앤드 프로토콜이기때문 중계기에 tcp가 안올라감

그래서 1 2 번 두개가 가능성이 있는 솔루션임.

그래서 1번으로 만약 패킷로스가 발생하면 컨제스천이다 라고 여기고, cwnd사이즈를 줄여주는 방식으로 할것임.

이게 결론적으로 tcp가 하는 일임! 패킷로스를 감지하면 cwnd를 줄인다.

근데 이 패킷로스를 어캐감지행?? 

쉽게말하면 1001번 패킷을 보냈는데 거기에대한 애크가 안오는 경우 1001번 패킷이 로스됐다고 생각함.

여기서 다시 집어보자면 윈도우는 한번에 보낼수있는 데이터이고 한번에 보낸다는 의미는 리시버에서 애크가 안와도 보낼수있는 최대 데이터의 양!

만약 cwnd의 크기가 1000이라고 치자! 여기서 패킷로스가 발생하면 이때 cwnd값은 뭘로하면 좋을까? TCP는 반으로 쫙줄임 500으로 함.

statistical multiplexing이란? 평균적인 인풋속도가 아웃풋 속도를 넘지 않는다는 평균 개념이 들어간 통계적인 멀티플렉싱이라고 함!

여러개의 인풋이 하나의 아웃풋으로 뭉치는 부분이 있는데 이런 인터넷의 구조상 호스트가 여러군데에서 오는 데이터가 하나로 몰리는 경우가 발생하고 이런 링크가 혼잡을 유발함!(컨제스천) 일시적으로 많아지면 버퍼가 쌓이고 이게 컨제스천이고 심하면 패킷로스가 발생하게됨

일시적인 컨제스천은 버퍼 스페이스를 늘리는 것으로 해결이된다.

그치만! 컨제스천이 길어진다면 소스에서 전송률을 낮춰야하는 상황이 발생한다.

 

이렇게 인풋이 계속 올라가면 아웃풋도 일정한만큼 올라가다가 한계치에 다다르게되면 더이상 올라가지않음 

 

 

여기 보면 컨제스천이 발생하지 않는 상황에서는 인풋rate가 올라가는 만큼 아웃풋도 올라간다 근데 점점 인풋이 더 증가할수록 아웃풋이 증가하는 비율은 점차 줄어들고 결국엔 급격하게 떨어져서 throughput이 0으로간다(0에수렴함 = 네트워크가 망가짐 그래서 저 동그라미 친부분을 왔다갔다하도록 해줘여함) 이때 throughput은 시간당 전송 성공률을 뜻한다

근데 어떻게해야 저수준에서만 왔다갔다함?

첫번째 방법은 end - end congestion control

로스나 딜레이를 관찰한 앤드시스템이 컨제스천을 유추하고 이를바탕으로 인풋속도를 조절하게 함

 

2번째 방법은 네트워크가 적극적으로 개입하는거

중계기가 자기가 컨제스천이 발생하면 그걸 엔드호스트에 적극적으로 알림! 그러면 그얘기를듣고 엔드호스트는 인풋 rate를 낮춰주는데 이방법은 tcp에서 채택하기 어려움 이유는 아까 말했져?

 

TCP에서는 Additive increase라고 하는걸 하는데 이게 뭐냐면 만약에 내가 최초의 cwnd가 500으로 시작했다 근데 내가 데이터를 보내고 애크를받았어 그럼 501로 늘리고 또 데이터를 보냈는데 애크를 받았어 그럼 502로 늘리고 이렇게 애크를 받을때마다 1씩 cwnd를 늘리는게 저거임! 

이렇게 처음에 1로 cwnd를  하면 애크받으면 1씩 늘리면서 해주는게 저거임

근데 만약에 이렇게 올리다가 컨제스천이 발생해서 패킷로스가 일어났다? 그럼 반으로 줄이는 거임 예를들어서 계속 애크받고 그러다보니까 cwnd가 510까지 갔다 근데 패킷로스가 발생했어 그러면 반을 줄여서 cwnd가 255가 되는거임 또 쭉 증가시키다가 로스 발생하면 또 반으로 줄이고 이런식으로 진행함.

이렇게 톱니마냥 진행함

이런식으로 진행하는게 1번 TCP

근데 이방식이 좋을까? 저렇게 CWND값을 올려서 저꼴난건데 반으로 줄이는게 좋은건가?

그래서 2번 TCP를 Tahoe라고 부르는데 얘는 cwnd를 로스가 발생하면 1로 줄임 근데 이러면 컨제스천은 해소가되는데

또 cwnd올리는데에 시간이  오래걸려 1부터 다시 증가해야하니까 그래서 1로 줄이는 대신 문제가없으면 이걸 cwnd사이즈를 빨리 키우자 함그래서 슬로우하게 스타트하지만 이걸 적당히 슬로우하게 해서 1다음에 2 다음에 4다음에 8이런식으로 증가하게함 긍까 애크가 하나오면 1+1해서 2보내고 그럼 애크2개오자나 그러면 2+2해서 다음 4보내고 또 4+4해서 8보내고 이런식으로 증가하게함(exponential growth)

 이 TCP 2번째 버전인 Tahoe는 현재 cwnd값의 2분의1을 threshold라고 저장해두고 그다음에 cwnd는 1로세팅하고 1부터는 저 threshold값 까지 exponential growth방식으로 증가하게 한다.

여기서 3dupACK가 와도 패킷로스라고 보고 또 1로 줄임!

 

TCP 3번인 Reno는 만약에 패킷 로스가 발생하면 현재의 cwnd의 2분의1을 threshold라고 일단 정하고 이 로스가 타임아웃에관한 것이라면 tcp2번 tahoe처럼 처리하고  3dup ACK에 의한 것이라면 1번 TCP처럼 함.

TCP 3번은 이런식으로 동작함! 두개를 상황에따라 다르게 합친것임 ㅎㅎ

 

TCP vegas도 있는데 이건 구현하기 어려워서 아직 구현 안됨 ㅋㅋ

 

 

 

'Computer_logic' 카테고리의 다른 글

Mealy & Moore VHDL code  (0) 2023.04.05
Mealy FSM & Moore FSM  (0) 2023.04.05
FLOW control  (0) 2022.11.09
TCP에러컨트롤  (0) 2022.11.09
propagation delay & transmission delay  (0) 2022.11.08

rwnd : 리시브 윈도우 값을 리시버가 결정함 

소켓은: 어플리케이션이 네트워크 서비스를 이용하기 위한 통로

버퍼중 센더가 보낸 데이터를 저장할수있는 공간을 rwnd라고함

센더는 리시브 윈도우값을 받은 이후에 애크를 받기 전까지 리시브 윈도우 사이즈 만큼만 최대한 보내는것

예를들어 301~400 ....해서 1000까지 보내면 LBS는 1000이되고 LBA(LastByteAcked)는 300이 되는거임

그러면 1000에서 300을뺀 700바이트가 in-flight하다고함 근데 이것이 rwnd보다 크면 안된다는 뜻임.

 

congetion control(엔드 호스트가 주체가되는 컨제스처 컨트롤)

TCP는 애크가 안오면(보낸 세그먼트가 로스가되거나, 애크가 에러가 발생하는것) 컨제스처라고 생각함

컨제스천이 발생하면 버퍼가 꽉차서 로스가 발생하여서 컨제스천이 발생한다고 생각하심. 딱 이정도로만 정리!

 

여기서 이 윈도우 사이즈는 리시브 윈도우 사이즈임

애크넘버부터 시작해서 윈도우 사이즈만큼 한번에 받을수있다

애크넘버가 301이고 윈도우 사이즈가 700이면 1000번바이트까지 받을수있음

'Computer_logic' 카테고리의 다른 글

Mealy & Moore VHDL code  (0) 2023.04.05
Mealy FSM & Moore FSM  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
TCP에러컨트롤  (0) 2022.11.09
propagation delay & transmission delay  (0) 2022.11.08

센더가 프레임을 하나 보내고 거기에 별 이상이없으면 리시버가 ack를 하나보냄 그 애크를 확인한후 다음 프레임을 보냄

그리고 그 보낸 프레임도 이상이없으면 애크를 다시 보냄

이때 프레임을 보내고 애크가 올때 까지 스탑하고 웨이트한다고(웨이트 트레이닝? 내가 제일 좋아하는건디 ㅋ) 해서 이런 방식의 프로토콜을 스탑엔 웨이트 ARQ라고함(기본적인 에러컨트롤 프로토콜)

몇번 세그먼트에 에러가 있다는걸 정확하게 알 수 없기 때문에 이런식으로함.

프레임에 에러가 있다면 리시버가 애크를 보내지 않는 방식으로 에러가 있다는것을 알림.

프레임마다 고유의 식별자를 붙혀야함.(식별자 두개만 있으면됨)

리시버가 두개의 식별자를 통해 다 알수있음

애크가 안오면 프레임을 재전송하게됨. 

프레임에서 식별자 0 을 보내면 리시버가 받고 다음 포인터인 1로 받을거다라고 포인팅을 한 후에 애크를 주면 (애크를 1로 보내면 0은 잘받았고 다음번엔 1로 받을걸 기대한다는 것)  애크를 받은 후에 포인터를 1로 바꿈 만약 프레임이 1로 보낼때 1이 오류가 나면 리시버는 해독을 중지 그럼 타이머가 동작하여 일정시간되면 프레임 재전송함 다시 1로 보냄 근데 이번엔 오류가 없으면 다시 애크를 0 으로 보내고 프레임은 포인터를 0으로바꾸고 0으로 프레임을 보내는 식으로 동작함.

근데 여기서 애크가 로스트가 된다면 다시 프레임에서는 원래 보냈던 0을 다시 보내겠지? 그럼 애크가 로스트가 났구나라고 유추할수있음 그래서 또받은 프레임은 DISCARD하고 다시 애크를 보냄 이것이 동작원리!

근데 여기서 보면 저 구간을 하나의 시간이라고 보면 프레임을 보낸 시간은 굉장히 작음 거의 놀고있다는 뜻임 효율이 안좋앙 효율을 좋게하기 위해선 프레임 렝스를 길게하는것도 하나의 방법임 근데 이 프레임 렝스가 너무 길면 무슨 문제가 있냐면 뭔 문제가 있데....

 

센더는 포인터 두개로 작동 프레임 하나가 준비되면 센드 넥스트포인터는 다음 포인터로 이동 센더는 바로 프레임 보냄 이때 프레임 번호는 버퍼의 번호 0을 찍어서보냄 

리시버도 하나의 포인터 가짐 센더가 데이터를 보내면 여기다 저장할거임 이라고 굳게 결심함. 프레임 0의 리시브가 완료되어서 리시버0에 저장이되고 애크를 보냄과 동시에 리시버N을 옆으로 이동 

애크의 수신이 완료된 시점에서는 센더에서 0번에 저장된 데이터가 지워지고 퍼스트 포인터가 오른쪽으로 옮겨짐 

 이 사진에서 회색으로 칠해진 저 칸을 뜻하는 두 선은 윈도우라고하는데 한번에 보낼수있는 프레임의 갯수를 알려줌

갑자기 보낼 데이터가 많아지면 애크를 기다리지 않고 1~7번까지 프레임으로 다보냄 이것이 GO BACK N 프로토콜임

애크가 오는 순서대로 윈도우가 오른쪽으로 슬라이딩됨.

사진에 있는 상황은 3개의 프레임을 보낸상황이고 애크2가 누락된 상황인데 여기서 애크3이 애크2와3을 합친역할을 해줘서 커버 쳐줌 즉 애크3을 받음으로써 프레임 12가 잘받은걸 확인할수있음

 

한번에 보낼수있는 프레임의 수는 2의M승-1개임

최악의 경우는 프레임은 다 잘갔는데 애크가 죄다 망가진 경우! 그런 경우에 우리가 다 프레임을 한번에 보내면 에러남

 

왜 GO BACK N ARQ인 이유?

만약 프레임 1부터7까지 쭉보냈는데 프레임 1에 에러가 나면 그럼 이 리시버는 아무짓도 안하게 설계가됨.

근데 프레임 2가 와도 아무짓도안함 리시버는 프레임1이올때까지 계속 기다림 그래서 1~7다 보내도 애크 하나도 못받고 타임아웃발생하면 프레임 1부터 죄다 다시 보내야함 그래서 GOBACKN임 1번으로 다시 돌아가 이느낌임!

 

TCP에러 컨트롤은 고백N에 기반을 두지만 좀 다름 

비슷한점은

네거티브애크가 없음

만약 1프레임에 대해 애크가없어도 계속 쭉쭉보냄

타임아웃을 통해 잃은걸 찾음

 

다른점은

1번이 올때까지 기다렸다가 순차적으로 보냄

버퍼를 세밀하게 운영 하면서 2번프레임이 들어왔는데 걔의 시작 바이트 넘버가있으면 1번 프레임의 바이트길이는 이정도였겠구나 추론하여서 그만큼 띄워놓고 2번프레임을 그자리에 써놓음(바이트 오리엔티드 넘버링을한다)

TCP는 아이디가 많음 가용한 버퍼스페이스가 제한되지않음(가변적인 버퍼스페이스 사용)

 

애크를 보내는건 두가지 의미가있음

1.니가 보낸 세그먼트를 잘받았다

2. 그걸 내가 잘 처리 완료했다

 

잘받았는데 애크를 안주는경우는 아직 상위레이어로 올리지않아서

 

TCP round trip time, timeout

타임아웃시간을 정하는 핵심 원리는? RTT란 무엇이며 이걸 통하여 시간을 정함

프레임을 보내면 애크를 보내오잖아? 그 애크를 받을때까지의 텀을 RTT(라운드 트립 타임)이라고함

근데 이 RTT는 그때마다 다름 그래서 이걸 어떻게 보정해주지? RTT의 마지막값을 타임아웃으로 정할까?

아니다 여러개를 샘플링해서 최근 RTT를 샘플링해서 평균구함 다만 산술 평균이 아니라 웨이티드 에버리지 구함

최근값에 좀 더 비중을 둠. 최근값이 좀 더 좋잖여~ 거기에 여유분을 더하는데 추정된 RTT에 여유분을 더하는데

타임아웃시간은 추정된 ERTT(추정된 RTT)+여유분

그래서 RTT보다 제법 크게 타임아웃이 결정이됨 하지만 핵심은 RTT에 기반을 둠

 

TCP의 또다른 특징은 

여기서 301을 제대로 받지못하면 DUPLICATE 애크를 보냄 이 듀플이케이트 애크가 NAK(네거티브 애크)같은거임

301못받았다고 야무지게 3번정도 보냄 기대하지않은 넘버들어올때마다 301을 원하니까301을 계속 달라고 보냄

한 3번정도 보내면301 보내줌 이렇게 3개의 듀플리케이티드 애크를 통해 빠르게 재전송을 하는것을 Fast retransmission이라고 함.

두개의 프레임마다 하나의 애크를보냄 이걸 딜레이드 애크라고함

 

윈도우(아까 에러처리할때 배웠징?)의 크기를 조절하는게 tcp에서 해주는중요한일

윈도우로 전송속도제어가능 

윈도우의 크기는 한번에 보낼수있는 세그먼트의 수를 의미 

이때 c는 가상의 파이프가 최대로 보낼수있는 양을 뜻한(최대전송량)

이 c는 정해져있는값 RTT도 정해져있는값 X를 크게하면 전송속도가 빨라짐 작게하면 느려짐

X가 너무 작으면 효율떨어짐 근데 너무 크면 에러가 발생하면 재전송하게되고 여유가 없어서 문제생김 그래서 이 X를 적당한 크기로 정해주는걸 윈도우 컨트롤 이라함 그걸로 우리는 트랜스미션레이트를 컨트롤 할수있음.

센더에서 리시버까지 가상의 파이프를 얼마나 채울것인가!! 적당하게 채우는게 핵심

TCP는 컨트롤을 3개를 하는데 FLOW컨트롤 Congestion 컨트롤 에러컨트롤 근데 여기서 

플로우 컨트롤과 콘제스쳐컨트롤을 한방에 정리할거임!

 

플로우컨트롤:

리시버가 오버로드(처리용량을 넘어서 일을 너무 많이주는것)(쉽게 얘기하면 오래된 스마트폰에 데이터를 많이 넣어주면 버벅거리는것)하는걸 방지하는것 but, 어떻게? 방지하는 주체는 리시버임 리시버가 주체적으로 컨트롤함 센더한테 리시브윈도우(rwnd)(리시버에 가용한 버퍼의 크기)를 알려주는 방법으로 컨트롤함

 

컨제스쳐컨트롤:

네트워크(센더와 리시버 사이의 세그먼트가 지나가는 길 사이에있는 중계장비나 링크를 다 합친 엔티티)가 오버로드하는걸 방지함. 오버로드되는 이유는 외부에서 인풋으로 너무많이 몰리면 오버로드됨. 어떻게 이걸 방지할까?

네트워크의 오버로드 여부를 센더가 결정을함 네트워크가 오버로드 되있다 라고 결론 내리면 콘제스쳐윈도우(cwnd)라고하는 윈도우값을 줄이고 문제없는거라고 결론을 내리면 윈도우값 늘림 윈도우를 늘이고 줄임에따라 데이터보냄 윈도우값크면 많이보내고 적으면 적게보내고 

리시브 윈도우와 컨제스쳐윈도우는 서로 독립적으로 운용을 함.

리시브 윈도우는 리시버 상태에따라 커졌다 작아졌다하고 컨제스쳐윈도우는 네트워크 상태에따라 커졌다 작아졌다 하니까 당연한 말임! 

그런데 TCP가 실제로 사용하는 윈도우는 딱 하나임

min(cwnd,rwnd)값으로 결정이됨 그래서 저 윈도우 사이즈를 w라고하면 w에 맞춰서 세그먼트 한번에 보냄 네트워크는 널널한데 리시버가 버벅대면 w줄여서 안좋은상황에맞춰서 보냄 이것이 TCP윈도우 컨트롤의 핵심임.

 

'Computer_logic' 카테고리의 다른 글

Mealy & Moore VHDL code  (0) 2023.04.05
Mealy FSM & Moore FSM  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
FLOW control  (0) 2022.11.09
propagation delay & transmission delay  (0) 2022.11.08

트랜스 미션 딜레이:

쉽게 얘기해서 계수구를 예를 들자면 계수구에서 물이 빠져나갈때 계수구의 넓이와 물의 양이 이 트랜스미션 딜레이를 좌우함. 계수구에서 물이 다 빠져 나가는 시간.

 

프로파게이션 딜레이:

쉽게 얘기해서 계수구를 빠져나간 물이 서울에서 대전까지 갈때 도달한 시간을 의미함

위 이미지에서 트랜스 미션 딜레이는 t2 - t1임 

또한 전체를 보내는 시간은 t4 - t1 ( 프로파게이션 딜레이 + 트랜스 미션 딜레이)

정리,

트랜스미션 딜레이는 프레임의 크기와 링크의 속도에 의해 좌우되고, 프로파게이션 딜레이는 거리와 일반적인 구리선로에서의 속도에 의해 좌우됨

 

 

 

 

'Computer_logic' 카테고리의 다른 글

Mealy & Moore VHDL code  (0) 2023.04.05
Mealy FSM & Moore FSM  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
FLOW control  (0) 2022.11.09
TCP에러컨트롤  (0) 2022.11.09

+ Recent posts