3.5.1
segment structure
*TCP: overview
RFCs:793, 1122, 1323, 2018, 2581
point-to-point
- 단일 송.수신자 간에 통신
신뢰적인 in-order byte stream
- Message에 구분이 없다.
// in-oder ( 순서, 꼭 붙인다.)
pipelined
- 혼잡제어나 흐름제어를 통해 window size를 제어한다.
- go back n, select repeat 알고리즘 사용
송,수신측은 buffer를
갖는다.
// 송신측 버퍼가 필요한 이유는 재전송을 수행하기 위해서 필요하다.
// 수신측은 순서가 필요해서 받는것이다.
// buffer 크기는 OS에서 하는것이다.
full duplex
- 동일 connection에 양단이 동시에 data를 전송 할 수 있다.
- MSS : maximum segment size (segment에서 app layer data의 최대 크기)
// IP의 안에 TCP 사이즈의 이야기가 나온다. IP의 사이즈 제한이 있다.
// 실제로는 세그먼트 사이즈와 상관이 없다.
connection
oriented
- handshake를 먼저 수행한다.
// Sink 패킷(sink 비트가 1만인것을 이야기하는 것이 아니다)
Flow control
- sender가 receiver를 압박하지 못하도록 receiver가 전송량을 통제한다.
*TCP segment의 구조
// 프로토콜의 옵션이 있는 이유는 다른 기능을 추가하기 위해서이다.
source port - 송신 어플리케이션의 port number
dest port - 수신 어플리케이션의 port number
// socket을 구분하게 한다. 네가지(source의 IP, Port number, dest의 IP, Port number)
sequence number : 어플리케이션 데이터의 바이트 스트림 넘버
// 몇번째 바이트부터 시작하는지 알려주는 역할
acknowledgement number : 어디까지 잘 받았는지 적어서 준다.
// ex 98 이라면 97번까지 잘받았고 98번 보내달라는 것이다.
headlen : 기본적으로 20byte이지만 더 길어질 수 있다.
flag : 상호배타적인 관계
- urg 긴급
- ack 1이면 ack.num 해석 필요
- psh 현재 OS에서 안쓰임
- rst 연결 종료
- syn Sink packet, 첫 통신할때 사용
- fin 접속 종료
receive window : 패킷 보내는 사람의 메모리에 남아 있는 사이즈를 알릴떄 사용
checksum : 패킷 깨졌는지 확인할 때 사용
Urg data pnter : Urg 내용이 들어간다. 하지만 사용하지 않음
Options : 표준안을 개선해서 추가될수 있음
*TCP seq#와 ACK
seq#
- Segment의 첫번째 byte의 stream에서의 byte 순서 번호
ACKs:
- 다음에 받을 첫번째 byte의 순서번호
- Cumulative ACK가 가능하다.
Q :순서가 틀린 segment를 수신한 경우 어떻게 할까??
A
: RFC에서는 어떤 규칙도 없다.
기본적으로
두가지 방법이 있다.
-
즉시 버린다.
- buffering한다. (중간에 빠진 data를 받기 위해..)
시작 seq#는
종료된 접속의 남아있는 seg와 유효한
seg와의 혼동을 막기위해 임의로 선택된다
*TCP : RTT(Round Trip Time) & Timeout
Q
: TCP의 timeout는
어떻게 설정할까???
- RTT보다 커야한다.
- but RTT 값은??
- 너무 작은 경우
- 불필요한 재전송이 일어난다.
- 너무 큰경우
- Segment 손실에 대한 대응이 늦어진다.
Q
: EstimatedRTT는 어떻게 설정 할
까???
- SampleRTT: segment가 송신된 시간으로부터 ACK가 도착한 시간간격
- 재전송 segment는 무시된다.
- EstiamteRTT는 매우 smooth하게 변경된다.
- EstiamatedRTT는 SampleRTT의 가중 평균 값이다.
*TCP : RTT(Round Trip
Time) & Timeout
RTT 추정치 예제
*TCP : RTT(Round
Trip Time) & Timeout
timeout
설정
- EstimatedRTT보다 약간의 여유값을 더한 값으로 설정
- SampleRTT의 변화량이 큰경우는 따라서 커져야한다. (반대의 경우도 동일)
- DevRTT : SampleRTT가 EstimatedRTT로 부터 얼마나 벗어나느지에 대한 예측
DevRTT = (1-β)* DevRTT + β* |SampleRTT-EstimatedRTT|
(β의
권장값 : 0.25)
실제 timeout 설정
TimeoutInterval = EstimatedRTT + 4*DevRTT
댓글 없음:
댓글 쓰기