Chapter 3-5 TCP
TCP의 특징
'연결'은 두 통신 종단 시스템의 TCP에 존재하는 상태를 공유하는 논리적인것,
TCP프로토콜은 오직 종단 시스템에서만 동작, 중간의 네트워크요소(라우터와 링크 계층 스위치)에서는 동작하지 않으므로 중간의 네트워크 요소들은 TCP연결 상태를 유지 하지 않음
1. point - to - point : 항상 단일 송신자와 단일 수신자 사이의 점대점
한 송신자가 여러 수신자에게 데이틑 전송하는 멀티캐스팅 불가능
2. reliable, in-order byte steam : 신뢰적, 순서대로 전달
3. pipelined
4. full duplex data : 양방향통신, 전이중 서비스를 제공, 만약 호스트 A의 프로세스와 호스트 B의 프로셋 사이에 TCP연결이 있따면, 애플리케이션 계층 데이터는 B에서 A로 흐르는 동시에 A에서 B로 흐를 수 있다.
5. 연결지향형 : 데이터를 다른 프로세스에게 보내기 전에 혠드셰이크를 먼저 해야함
6. flow controlled
3-5-1 TCP 세그먼트 구조
순서 번호와 확인응답 번호
TCP 세그먼트 헤더에서 가장 중요한 필드 두 가지
세그먼트에 대한 순서번호(sequence numbers) : 세그먼트에 있는 첫 번째 바이트의 바이트 스트림 번호
내가 보내는 바이트를 세그먼트 단위로 짜를거고, 그 세그먼트의 맨 앞쪽의 인덱스 번호
확인응답 번호(acknowledgements) : 호스트 A가 자신의 세그먼트에 삽입하는 확인응답번호는 호스트 A가 호스트 B로부터 기대하는 다음 바이트의 순서번호 (B에서 A로 데이터 송신)
수신자가 0번 시퀀스넘버 받았다면 그 다음으로 받기 원하는건 1024를 원함
=> 0~1023번 세그먼트에 대한 ACKnumber는 1024
cumulative ACK 방식
'A'가 set되어 있어서 확인응답번호가 유효함 !
만약 호스트 B가 0~535 수신, 900~1000수신함 원래는 536~899를 받아야하는데 900~1000이 먼저 옴
그럼 어떻게 함? (세번째 세그먼트가 순서 틀리게 도착해버림)
=> 어떠한 규칙도 부여 X, 개발자에게 맡긴다
(그래서 고백엔에서 쓰는 cumulaticve를 쓰지만 그렇다고 고백엔 방식인건 아니다)
보통 두가지 선택이 있다
1) 수신자가 순서가 바뀐 세그먼트를 즉시 버린다
2) 수신자는 순서가 바뀐 데이터를 보유하고, 빈 공간에 잃어버린 데이터를 채우기 위해 기다린다
2번이 좀 효율적임
텔넷; 순서 번호와 응답확인 번호 사례연구
왕복시간(RTT)예측과 타임아웃
타임아웃은 세그먼트가 전송된 시간부터 긍적 확인응답될 때까지의 시간인 연결의 왕복시간(RTT)보다 좀 커야 한다. 그렇지 않으면 불필요한 재전송 발생
그럼 길게 잡으면 : 너무 오래 기다려야해서 반응이 느림
왕복시간 예측 어떻게?
세그먼트에 대한 RTT샘플은 세그먼트가 송신된 시간부터 그 세그먼트에 대한 긍정응답이 도착한 시간까지의 시간길이임
모든 전송된 섹먼트에 대해 샘플알티티를 측정 X 대부분 TCP는 한 번에 하나의 샘플알티티측정만 시행
즉, 어떤 시점에서 샘플알티티는 전송되었지만 현재까지 확인응답이 없는 세그먼트 중 하나에 대해서만 측정, 대략 왕복시간마다 샘플알티티의 새로운 값을 얻게 한다
재전송된 세그먼트에 대한 샘플알티티는 계산하지 않음 한번 전송된 세그먼트에 대해서만 측정함
대체로 RTT를 측정하기 위해 SampleRTT값(불규칙적임)의 평균값을 채택
=> TCP는 샘플RTT값의 평균을 유지한다
샘플RTT값의 평균= estimateRTT
estimateRTT는 SampleRTT의 가중평균임(예전 샘플보다 최근 샘플에 높은 가중치를 줌)
3-5-2 신뢰적인 데이터 전송
IP의 비신뢰적인 최선형 서비스에서 신뢰적인 데이터 전송 서비스를 제공함
=> 프로세스가 자신의 수신 버퍼로부터 읽은 데이터 스트림이 손상되지 않았으며 손실이나 중복이 없다는 것과 순서가 유지된다는것을 보장
파이프라인, cumulative acks
타이머는 단일 재전송 타이머를 사용
TCP sender의 데이터전송,재전송에 관련된 세가지 이벤트
1. 상위 애플리케이션으로부터 수신된 데이터
애플리케이션으로부터 데이터 받고, 세그먼트로 캡슐화하고 IP에세 세그먼트 넘김
(순서번호 포함)
2. 타이머 타임아웃
타임아웃을 일으킨 세그먼트를 재전송하여 응답함 그리고 타이미 다시 시작
3. ack수신
TCP가 변수 Sendbase(수신확인응답이 확인되지 않은 가장 오래된 바이트의 순서번호)와 ack값 y를 비교
(sendbase-1은 수신자에게 정확하게 차례대로 수신되었음을 알리는 마지막 바이트의 순서번호)
y는 y바이트 이전의 모든 바이트의 수신 확인
y > sendBase : ack은 이전에 확인응답 안 된 하나 이상의 세그먼트 확인 => 송신자는 자신의 sendbase변수 갱신 , 아직 확인응답이 안된 세그먼트가 존재한다면 타이머 다시 시작
3-5-3 flow control