Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 확인문제
- 웹개발기초
- 백준10828
- 백준평범한배낭
- 백준스택
- 이것이자바다
- 냅색알고리즘
- 가운데를말해요
- java
- BOJ
- 합성곱연산
- 백준괄호
- KT포트포워딩
- 컴퓨터비전
- 카카오코테
- 2019카카오코테
- 윤곽선검출
- 스파르타코딩클럽
- 이것이자바다확인문제
- 운영체제
- 딥러닝
- 백준9012
- 코딩테스트실력진단
- 백준가운데를말해요
- 백준온라인저지
- 코테
- BOJ1655
- 이것이자바다9장
- 코드트리
- 백준
Archives
- Today
- Total
코딩하는 락커
3. 전송 계층 5 본문
흐름 제어flow-control
- 애플리케이션이 데이터를 읽는 속도가 비교적 느리다면, 송신자가 점점 더 많은 데이터를 빠르게 전송함으로써 연결의 수신 버퍼에 아주 쉽게 오버플로를 발생시킴.
- 흐름 제어 서비스flow-control-service: TCP가 송신가자 수신자의 버퍼를 오버플로 시키는 것을 방지하기 위해서 애플리케이션에게 제공하는 서비스. (수신자 제어)
- 혼잡 제어 서비스congestion-control-service: TCP 송신자가 IP 네트워크에서 혼잡 때문에 억제되는 것. (송신자 제어)
- 수신자는 수신 윈도우(receive window, rwnd)라는 변수를 유지하여 흐름제어 제공.
- rwnd(버퍼의 여유공간) = RcvBuffer - |LastByteRead - LastByteRcvd|
- LastByteRead: 수신자의 애플리케이션 프로세스에 의해서 버퍼로부터 읽힌 데이터 스트림의 바지막 바이트 수
- LastByteRcvd: 수신자의 네트워크로부터 도착하여 수신 버퍼에 저장된 데이터 스트림의 마지막 바이트 수
- 송신자는 rwnd의 값보다 작은 확인응답 안 된 데이터를 유지함으로써 송신자는 수진자의 수신 버퍼에 오버플로가 발생하지 않는다는 것을 확신함
- 전송 확인응답 안된 데이터의 양: LastByteSent - LastByAcked
- 문제점
- 수신자의 수신 버퍼는 rwnd=0으로 가득 찼다고 가정.
- 송신자에게 rwnd=0이라고 알림.
- 수신자에서의 애플리케이션 프로세스가 버퍼를 비우더라도 송신자는 rwnd=0이므로 세그먼트를 보내지 않음.
- 해결방안
- TCP는 송신자가 수신자의 rwnd=0일 대 1바이트 데이터로 세그먼트를 계속해서 전송.
- 이 세그먼트들은 수신자에 의해서 ACK를 보냄.
- 결과적으로 버퍼는 비워지고 ACK의 rwnd에는 0이 아닌 값이 전송됨.
TCP 연결 관리
- 3-way-handshaking
- 클라이언트 측 TCP는 애플리케이션 데이터를 포함하지 않고, 세그먼트의 헤더에 SYN 비트라고 불리는 비트가 1이고, 최초 순서번호로 client_isn인 세그먼트를 서버로 송신함.
- 서버는 TCP 연결 승인 세그먼트로 애플리케이션 데이터를 포함하지 않고, 세그먼트의 헤더에 SYN 비트라고 불리는 비트가 1이고, ACK는 client_isn+1 이고, 최초 순서번호는 server_isn인 세그먼트를 클라이언트로 송신함. (SYNACK 세그먼트로 불림)
- 클라이언트는 애플리케이션 데이터를 포함하고, ACK는 server_isn+1이고, 최초 순서번호는 client_isn+1인 세그먼트를 서버로 송신함.
- TCP close
- 클라이언트 TCP가 서버 프로세스에게 FIN비트라고 불리는 비트가 1인 종료 세그먼트를 송신함.
- 서버는 이 세그먼트를 수신하면 클라이언트에게 ACK 세그먼트를 보내면서 아직 보내지 못한 세그먼트를 전송함.
- 서버는 FIN비트가 1인 종료 세그먼트를 송신함.
- 클라이언트는 서버의 종료 세그먼트에 확인 응답함.
- 두 호스트의 자원(버퍼와 변수)들은 할당이 해제됨.
- TCP 상태 전이
- 클라이언트 측
- 클라이언트 TCP가 FIN비트가 1인 세그먼트를 서버측에 송신함.
- 클라이언트는 FIN_WAIT_1 상태 진입
- 클라이언트는 서버로부터 ACK를 포함하는 세그먼트를 수신받음.
- 클라이언트는 FIN_WAIT_2 상태 진입
- 클라이언트는 서버로부터 FIN비트가 1인 세그먼트를 수신받음.
- 클라이언트는 서버에게 ACK 송신.
- TIME_WAIT 상태 진입.
- TIME_WAIT이 끝나면 연결 종료, 클라이언트 측 자원 해제.
- 클라이언트 TCP가 FIN비트가 1인 세그먼트를 서버측에 송신함.
- 서버 측
- 클라이언트로부터 FIN비트가 1인 세그먼트 수신.
- 서버는 클라이언트에게 ACK 세그먼트 수신.
- 서버는 CLOSE_WAIT 상태 진입.
- 서버는 클라이언트에게 FIN=1인 세그먼트 전송.
- 서버는 LAST_ACK 상태 진입.
- 서버는 클라이언트로부터 ACK 수신, 연결 종료, 자원 해제.
- 클라이언트 측
'🌐 네트워크' 카테고리의 다른 글
4. 네트워크 계층 1 (0) | 2022.04.11 |
---|---|
3. 전송 계층 6 (0) | 2022.04.05 |
3. 전송 계층 4 (0) | 2022.04.04 |
3. 전송 계층 3 (0) | 2022.03.29 |
3. 전송 계층 2 (0) | 2022.03.28 |
Comments