TCP(Transport Control Protocol)
- TCP는 전송계층에서 사용하는 프로토콜로 연결형 서비스
- 장치들 사이에 논리적인 접속을 성립하기 위해 연결을 설정해 신뢰성을 보장
- 연결을 설정/해제하는 과정 필요
1) 3-way-handshake
- TCP 통신에서 연결을 설정하는 과정
(1) Client -> Server : SYN
- 접속 요청 프로세스(Client)가 연결 요청 메시지 전송(SYN)
- 송신자가 최초로 데이터를 전송할 때 Sequence Number을 난수로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트 전송
(2) Server -> Client : SYN + ACK
- 접속 요청을 받은 프로세스(Server)가 요청을 수락했으며, 접속 요청 프로세스(Client)도 포트를 열어 달라는 메시지 전송(SYN + ACK)
- 수신자는 Acknowledgement Number 필드를 Sequence Numer + 1로 지정하고, SYN와 ACK 플래그 비트를 1로 설정한 세그먼트 전송
(3) Client -> Server : ACK
- 마지막으로 접속 요청 프로세스(Client)가 수락 확인을 보내 연결을 맺음(ACK)
- 전송할 데이터가 있으면 이 단계에서 데이터 전송 가능
2) 4-way-handshake
- TCP 통신에서 연결을 해제하는 과정
(1) Client -> Server : FIN
- 프로세스(Client)가 연결을 종료하겠다는 FIN 플래그 전송
- 프로세스(Server)가 FIN 플래그로 응닫하기 전까지 연결을 유지
(2) Server -> Client : ACK
- 프로세스(Server)는 일단 확인 메시지를 보내고 전송하던 데이터를 이어서 계속 전송
- 프로세스(Server)는 Acknowledgement Number 필드를 Sequence Number + 1로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트 전송
- 프로세스(Server)는 전송할 데이터가 남아있다면 이어서 계속 전송
(3) Server -> Client : FIN
- 프로세스(Server)가 통신이 끝났으면 연결 종료 요청에 합의한다는 의미로 프로세스(Client)에 FIN 플래그를 1로 설정한 세그먼트 전송
(4) Client -> Server : ACK
- 프로세스(Client)는 확인했다는 의미로 ACK 전송
3) TCP 상태 전이도
! TCP의 연결 설정 과정과 연결 종료 과정이 차이나는 이유
- Client가 데이터 전송을 마쳤다고하더라도 Server는 아직 전송할 데이터가 남아있을 수 있음
- 일단 FIN에 대한 ACK 전송한 뒤, 데이터 전송을 마친 후 FIN를 전송하므로 한 단계를 더 거침
! 만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 FIN 패킷보다 늦게 도착하는 상황이 발생하면?
- 이러한 현상에 대비해 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거침(TIME_WAIT)
! 초기 Sequence Number인 ISN을 난수로 설정하는 이유
이전의 Connection의 순차적인 패킷으로 오해받는 상황을 방지하기 위해
TCP 오류제어
- 수신측에서 데이터의 오류를 판단하고 재전송 요청
1) 오류 검출(Error Detection)
(1) Checksum
- 손상 세그먼트 검사
- 손상된 세그먼트 발견 시 해당 세그먼트를 폐기
(2) Acknowledgement
- 정상 세그먼트 수신을 송신측에 통보
(3) Time out
- 송신측은 세그먼트 전송 시마다 timer를 설정
- Time-out 시에는 손상 혹은 손실로 간주하고 재전송
오류종류 | Error Detection | Error Recovery |
데이터 손상 | Checksum | 재전송 |
데이터 분실 | Sequence Number, timer | 재전송 |
데이터 순서 바뀜 | timer | 재배치 |
2) 재전송 방식
TCP 흐름 제어
- 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법
1) Stop and Wait
- 매번 전송한 패킷에 대한 확인 응답을 받아야 다음 패킷을 전송
2) Sliding Window
- 수신측에서 설정한 Window size만큼 송신측에서 확인 응답없이 패킷을 전송해, 데이터흐름을 동적으로 조절
- 패킷에 대한 응답이 확인되는 대로 옆으로 window 사이즈만큼 다음 패킷의 데이터를 전송
TCP 혼잡 제어
- 송신측의 데이터 전송 속도와 네트워크의 데이터 처리속도의 차이를 해결하기 위한 기법
1) AIMD(Additive Increase / Muticative Decreas)
- 가산 증가 방식
- 패킷을 하나씩 늘려가며 window size 조절
- 패킷 전송해 실패하거나 일정 시간이 지나면 window size를 절반으로 감소
2) Slow Start
- 지수 증가 방식
- 패킷을 2배수로 증가시켜 window size 조절
3) Fast Retransmit(빠른 재전송)
- 패킷이 순서대로 도착하지 않았을 때, 순서대로 도착한 마지막 패킷의 다음 패킷에 대한 ACK 패킷을 실어보냄
- 송신측에서는 중복된 순번의 ACK 패킷을 확인한 후 해당 패킷을 재전송
4) Fast Recovery(빠른 회복)
- 혼잡이 감지될 경우 window size를 절반으로 줄이고 선형 증가하는 방식
'CS > Network' 카테고리의 다른 글
[네트워크] HTTP 요청/응답 헤더 (0) | 2020.06.26 |
---|---|
[네트워크] HTTP와 HTTPS (0) | 2020.06.24 |
[네트워크]TCP와 UDP (0) | 2020.06.24 |
[네트워크] TCP/IP (0) | 2020.06.24 |
[네트워크] OSI 7 계층 (0) | 2020.06.24 |
댓글