→ Open in Slid
TCP Sender Events
TCP 세그먼트를 보내는 측(Sender)에선 무슨 일을 하는지 알아보자.
- 애플리케이션 계층에서 데이터가 도착했다.
시퀀스 넘버와 체크섬을 달아서 세그먼트를 만든다.타이머가 동작중이라면?타이머는 가장 오래된 전송 중인(In-Flight) 세그먼트(가장 낮은 시퀀스 번호)에 맞춰져 있다.세그먼트를 보낸지 너무 오래됐으면 도중에 유실된 것으로 판단한다. 이 때 사용하는 시계가 타이머이다.타이머가 동작중이지 않다면?타이머를 켜고 해당 세그먼트에 맞춘다.
- Time Out 발생!Time Out된 세그먼트를 다시 전송한다.Ack를 받지 못한 가장 작은 시퀀스의 세그먼트에 타이머를 맞춘다. // 왜? - 강의에서 확인
- Ack를 받았다.받은 Ack에 해당하는 세그먼트를 In-Flight(전송 중)에서 Acked로 변경한다.In-Flight 세그먼트가 있으면 타이머를 세팅한다.
- TCP 재전송 시나리오수신 측에서 보내는 ACK가 Loss 되어 재전송된 경우보낸 데이터가 제대로 도착했어도 ACK가 Loss 됐을 수 있다.Ack Timeout으로 송신측은 아까 보낸 데이터를 다시 보낸다.수신 측은 Loss 된 ACK를 다시 보낸다.ACK를 받기 전에 Time-out 된 경우ACK는 잘 도착했으나 ACK받기 전에 Time-out이 됐다면받은 ACK에 해당하는 세그먼트는 ACK가 도착하기 전에 재전송된다.수신 측에서는 받은 데이터를 또 받는다.TCP는 누적 ACK를 사용하므로 이전에 받았던 데이터가 다시 도착하더라도 그 데이터에 대한 ACK를 보내는 것이 아니라 최근에 받았던 데이터(Highest Sequence Number)에 대한 ACK를 보낸다.Ack가 손실됐지만 Time-out이 발생하기 전에 다음번 데이터의 ACK를 받은 경우ACK == 100을 받지 못했어도 ACK ==120을 받았다면 TCP는 누적 ACK를 사용하기 때문에 100번 데이터도 잘 도착한 것으로 인식한다.따라서 재전송은 필요없다.
TCP Receiver Events // 이해안됨. 강의에서 다시 듣기
TCP 세그먼트를 받는 측(Receiver)에선 무슨 일을 하는지 알아보자
- Ack GenerationIn-Order의 경우매번 Ack를 보내는 것은 낭비다. 따라서 받은 Segment들에 대해 모두 ACK를 보냈다면 다음 In-Order Segment를 500ms동안 기다린다. 500ms동안 오지 않았다면 바로 ACK를 전송한다.500ms 동안 기다릴 때 다음 세그먼트가 오면 바로 ACK를 보낸다.Out of Order의 경우받은 Segment들 사이에 누락된 것이 있다면 가장 낮은 값의 ACK를 재전송한다.(Duplicated ACK 전송)누락된 것을 받았다면 기다리지 않고 ACK를 전송한다.
- TCP Fast RetransmissionTime out 시간은 상대적으로 길다.3개의 중복된 ACK를 받았을 때 그 세그먼트는 Loss가 발생한 것이라고 생각하고 해당 Segment를 즉시 재전송한다.
TCP Flow Control
- Flow Control은 리시버 버퍼가 가득 차는 일을 방지한다.
- RWND는 리시버 TCP 버퍼의 여유공간이다.리시버가 센더에게 보내는 Segment의 헤더에는 rwnd 값이 포함되어 있다.센더는 In-Flight Segment개수를 rwnd를 를 넘지 않도록 조정한다. TCP 연결을 맺을 때 Seq number를 동기화하고 RWND 값을 교환한다.
본 게시물은 kocw 이화여자대학교 이미정 교수님의 컴퓨터 네트워크 강의를 듣고 정리한 글임을 밝힙니다.
내용상 틀린 부분이 있을 수도 있으며 이에 대한 책임을 지지 않습니다.
틀린 부분이나 오타 지적은 댓글로 남겨주세요.
www.kocw.net/home/cview.do?cid=e44bdd9b3a3f9bb5