2020. 6. 10.

[Network] 3.5.1 segment structure


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


댓글 없음:

댓글 쓰기