
TCP(Transmission Control Protocol)는 인터넷에서 데이터를 전송하는 주요 프로토콜 중 하나IP와 함께
TCP/IP라고 불린다.특징 중 하나로 신뢰성을 보장한다.
데이터 패킷에
순서 번호(Sequence Numnber)를 부여하여
수신자가 패킷을 올바른 순서대로재조립할 수 있도록한다.만약 순서대로 도착하지 않는다면
누락된 패킷이 도착할 때 까지 대기하고
그 후에 패킷을 순서대로 재조립하여 애플리케이션에 전달한다.
체크섬(Checksum)을 이용하여데이터의 오류를 검출한다.
체크섬은 송신자에서 계산되어 패킷 헤더에 포함되어 전송되며
수신자는 체크섬을 다시 계산하여 원래의 체크섬과 비교한다.만약 두
체크섬이 일치하지 않으면손상되었음을 의미하고
수신자는 송신자에게 해당 패킷을다시 요청한다.
저 방법 뿐만이 아니라 체크섬 검증 방식에는 여러가지가 있다.
[네트워크] checksum 생성 및 검증

송신측에서 1개의 프레임을 송신하고,
수신측에서 수신된 프레임의 에러 유무 판단에 따라
ACK or NAK(Negative Acknowledgement)를 보내는 방식.
식별을 위해 데이터 프레임과 ACK 프레임은 각각 0,1 을 번갈아가면 부여한다.
수신측이 데이터를 받지 못했을 경우 NAK 을 보내고
NAK을 보낸 송신측은 데이터를 재전송한다.
만약 데이터나, ACK이 분실됐을 경우, 타임아웃이 발생하게 되는데
이때 송신측은 데이터를 재전송한다.
전송된 프레임이 손상되거나 분실된 경우 또는 ACK 이 손실되어 TIME_OUT이 발생한 경우
확인된 마지막 프레임 이후로 모든 프레임을 재전송한다.
슬라이딩 윈도우는 연속적인 프레임 전송기법으로
전송 측은 전송된 프레임의 복사본을 가지고 있어야하며,
ACK과 NAK 모두 각각 구별해야한다.
- ACK : 다음 프레임을 전송하라는 의미
- NAK : 손상된 프레임 자체 번호를 가지고 있다.
수신측으로 0~5의 데이터를 보냈고 송신 도중 ACK 을 받는다.
ACK 을 받은 송신 측은 윈도우를 이동해가며 전송을 지속한다.만약 2에서 이상을 감지하고 NAK2를 송신측으로 보내면
2 부터 다시 재전송한다.

수신측에서 데이터 1을 받고 다음에 데이터 3을 받은 경우 ,
데이터 2를 받지 못했으므로
수신측에서는 데이터 3예상한 데이터가 아닌 것을 폐기하고
데이터 2를 받지 못했다는NAK2를 보낸다.송신측은 데이터 2번부터 다시 재전송 한다.
전송 측은 분실된 ACK을 다루기 위해 타이머를 가지고 있다.
전송 측에서는 이 타이머 동안 수신 측으로 ACK 데이터를 받지 못했을 경우
마지막 ACK된 데이터부터 재전송한다.
Go-Back-N ARQ 의 단점을 보완한 방식이다.
손상되거나 손실된 프레임만 재전송한다.
따라서 데이터 재정렬을 수행해야하며 별도의 버퍼를 필요로 하다.
수신 측에서는 이 버퍼로 데이터를 정렬을 한다.

TCP는 데이터를 보내는 속도를 제어하여 수신자의 버퍼가 넘치지 않도록 한다.이를 위해 수신자는 수신 가능한 양을 송신자에게 알리며
송신자는 이 정보를 바탕으로 데이터를 보내는 속도를 조절한다.

매번 전송한 패킷에 대한 확인 응밥을 받아야만 그 다음 패킷을 전송하는 기법

window size : 7수신 측에서 설정한 윈도우 크기만큼 송신측에서 패킷 각각에 대한 확인 응답없이 세그먼트를 전송하고
데이터의 흐름을 동적으로 조절하는 기법최초 윈도우의 크기는
3 way handshaking과정을 통해 설정된다.
이정보는TCP header에 저장되고 관리된다.윈도우에 포함된 만큼은 수신 측의 응답 없이도 보낼 수 있지만, 그 이상은 보낼 수 없다.
그 이상의 데이터 패킷을 보내기 위해서는 수신의 응답이 확인이 되어
window의 크기가 갱신되어야한다.
네트워크의 혼잡 상태를 관리하여 패킷의 손실을 최소화한다.
패킷이 손실되면 네트워크가 혼잡하다고 가정하고 데이터를 보내는 속도를 줄인다.
이후 네트워크 상태가 개선되면 다시 속도를 늘리는 매커니즘을 사용한다.
합 증가 / 곱 감소 알고리즘
합 증가처음에 패킷 하나를 보내는 것으로 시작하여 전송한 패킷이 문제 없이 도착한다면
window size를 1씩 증가시킨다.
곱 감소만약 패킷 전송에 실패하거나
TIME_OUT이 발생하면
window size를 절반으로 감소시킨다.
여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만
시간이 흐르면 평형 상태로 수렴하게 되는 특징이 있다.
단점
- 초기 네트워크의 높은 대역폭을 사용하지 못한다.
- 네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄이는 문제점이 있다.
- 초기에 전송 속도를 올리는데 시간이 오래걸린다.
AIMD는 초기에 전송 속도를 올리는데 시간이 오래 걸린다는 단점이 있다.
Slow Start는AIMD와 마찬가지로 패킷을 하나씩 보내는 것부터 시작한다.
송신은ACK을 받을 때마다window size를1씩 증가시킨다.즉, 한
window를 다보내면window size는2배가 된다.
= RTT(Round Trip Time) 마다window size는 2배가 된다.이때
RTT 당 window size 그래프는지수함수 그래프 모양이 된다.
window size가임계값에 도달하면Congestion Avoidance방식으로 전환된다.
Slow Start이후window size가 임계 값에 도달하면 발생한다.이 때부터
RTT 당 window size는 1 씩 증가한다.
만약 패킷 손실이 감지되면
임계값을 현재 window size의 절반으로 감소시키고
window size를1로 재설정한다.이후
Slow Start부터 재시작한다.

혼잡 상태(패킷 손실)가 발생하면
Congetsion Avoidance때 처럼
window size 를 1 로 재설정하는 것이 아닌
window size 의 절반으로 줄이고AIMD방식으로 동작시킨다.
먼저 도착해야할 패킷(2)이 도착하지 않고다음 패킷(3)이 먼저 도착한 경우에도ACK을 보낸다.
단, 이ACK에원래 도착해야할 패킷 번호(2)를 담아서 보낸다.따라서 이후
4,5,.. 가 도착하더라도 송신측으로 보내는 패킷에는2가 연속적으로 가게된다.수신 측은
중복된 패킷번호 3개를 연속적으로 받으면 그 패킷을재전송한다.이러한 상황을
혼잡 상태로 인지하고window size를 절반으로 줄인다.