연결 지향형 트랜스포트 : TCP
<TCP : Overview>
1) 단일 송신자와 단일 수신자 사이의 점대점 연결
2) 핸드쉐이크가 필요한 신뢰적 연결
3) in-order byte steam
4) 양방향 서비스
5) 흐름 혼잡을 제어함
3.5.2 TCP 세그먼트 구조(책 참조)
<순서번호와 확인응답 번호>
여기서 만약 3바이트를 전송한다고 생각하면 SEQ와 ACK번호는 어떻게 변할까?
CDE를 전송한다고 생각해보자. 이 때 C(42) D(43) E(44) 따라서 그 다음 ACK = 45가 될 것 이다.
<왕복시간(RTT) 예측과 타임아웃>
어떻게 tcp의 timeout을 설정해야 할까? 만약 타임아웃이 너무 짧다면 불필요한 재전송을 하게 되고 너무 길면 효율이 안좋게 된다. 그래서 RTT보다 조금 길게 해야 하는데 RTT는 항상 다르다. 따라서 sampleRTT(타임아웃 측정한 시간)의 평균값이 estimatedRTT를 이용한다.
여기서 1번을 타임아웃으로 설정하면 에러가 발생하는 구간이 생기고 2번을 설정하면 속도가 느려지게 된다. 따라서 samplertt와 estimatertt의 값 차이인 devrtt를 더해준다.
TimeoutInterval = EstimatedRTT + 4 * DevRTT.
3.5.4 신뢰적인 데이터 전달
일단 seq 초기화 과정을 거친 후 데이터를 전송한다.
receiver쪽에서 데이터를 받으면 그 다음 seq#를 설정하고 데이터를 전송한다.
Nextseq#는 nextseq# + length(data)에 의해 적용된다.
If (timer currently not runnimg) start timer.
ACK=100을 못받았어도 120을 받았을 때 이를 신뢰함.
<빠른 재전송>
타임아웃이 유발하는 재전송의 문제는 타임아웃의 주기가 때때로 비교적 길다는 점이다.
만약 3개의 중복 ACK를 수신하는 경우 TCP는 타이머가 만료되기 전에 손실 세그먼트를 재전송 함.
<흐름 제어>
센더의 속도가 빠르거나, 데이터를 읽는 속도가 비교적 느리다면 수신 버퍼에 오버플로가 쉽게 생긴다. 따라서 속도를 일치시키는 흐름제어 서비스를 제공한다.
[참조] Computer Networking: A Top Down Approach - J.F Kurose and K.W. Ross