나나나
[네트워크] TCP 본문
가장 일반적인 전송 계층 프로토콜로 IP와 함께 작동하며 IP프로토콜에서 제공하는 네트워크 계층 서비스를 사용하여 프로세스 간에 안정적인 전송 서비스를 제공한다.
TCP가 애플리케이션 계층에 제공하는 서비스
- 연결 지향형 서비스
- 연결 설정 / 데이터 전송 / 연결 종료의 과정을 거친다. 이는 전송 데이터의 신뢰성과 무결성을 보장하기 위한 것이다.
- 스트림 데이터 서비스
- TCP에서는 데이터가 바이트 스트림으로 송수신된다. (UDP는 데이터그램, IP는 패킷 단위를 사용함) 네트워크 계층은 패킷을 사용하기 때문에 TCP는 바이트 스트림을 기본단위로 하여 세그먼트로 그룹화하고 각 세그먼트에 헤더를 추가한 다음 이를 네트워크 계층에 전달한다. 네트워크 계층에서 각 세그먼트는 전송을 위해 IP 패킷에 캡슐화된다. TCP헤더에는 제어 목적에 필요한 정보가 있으며 세그먼트 구조와 함께 논의된다.
- 전이중 서비스
- 통신이 동시에 양방향으로 이루어질 수 있다.
- 신뢰성
- TCP는 신뢰성을 위해 오류를 감지하는 체크섬을 사용한다. 그 외의 재전송, Acknowledgement 정책, 시퀀스 번호 및 타이머를 통해 손실/손상된 패킷을 복구한다. 신뢰성 보장을 위해 바이트 번호, 시퀀스 넘버 및 ack 번호를 사용한다. 또한, 혼잡 제어 매커니즘을 사용한다.
- 프로세스 간 통신
- TCP 는 프로세스간 통신 기능을 제공한다. 즉, 데이터 전송은 종단 시스템에서 실행되는 개별 프로세스 사이에서 발생한다. 이것은 포트 번호나 포트 주소를 사용하여 수행된다. 포트 번호는 16bit길이이며 호스트에서 데이터를 송수신하는 프로섹스의 식별을 돕는다.
- 멀티플렉싱
- +) 멀티플렉싱 :기본적으로 멀티플렉싱이란 여러 개를 하나로 묶어 다중화 시킨다는 뜻이다. 코드에서 볼 것은 여러 개의 channel을 하나로 묶어서 사용하는 것인데, 이 방법을 입출력에 적용한다. 여기서 입출력 버퍼를 사용하게 된다.출처:[JayTech의 기술 블로그]
- https://pjh3749.tistory.com/170
- Blocking mode로 동작하는 것들과는 달리 멀티플렉싱은 Non-Blocking Mode로 동작하게 된다.
- 하나의 통신 채널을 통해서 둘 이상의 데이터를 전송하는데 사용되는 기술이다.
- 물리적 연결을 통해 포트 번호 간 다수의 논리적 연결을 설정할 수 있으므로 송신자 및 수신자의 종단에서 각각 멀티플렉싱 및 디멀티플렉싱을 수행한다.
바이트 번호, 시퀀스 번호, Ack 번호
- 전송될 모든 데이터 바이트는 번호가 매겨지며, 이 번호의 시작은 임의적이다.
- 시퀀스 번호는 세그먼트에 제공되어 다른 순서로 도착하더라도 수신자 종단에서 바이트를 재어셈블한다. 세그먼트의 시퀀스 번호는 전송되는 첫 번째 바이트의 바이트 번호이다.
- TCP는 전이중 서비스를 제공하므로 Ack 번호가 필요하다. Ack번호는 수신자가 수신할 것으로 예상하는 다음 바이트 번호이며 이전 바이트 수신에 대한 Ack도 제공한다.
- A : 바이트 번호 1000까지 받았고 그 다음으로 1001부터 받길 원하기 때문에 1001이라는 ACK를 보낸다.
- B : A에게 1001부터 시작하는 데이터 BYTES를 보낸다. B는 13001까지 받았기 때문에 13002라는 ACK를 보낸다.
혼잡제어
송신 측에서 Ack수신 여부로 네트워크 상황을 판단해 송신 데이터의 크기를 조절하는 기법
- 송신자 전송률 제한 : cwnd의 값을 조정해 데이터 전송 비율 조정
- 혼잡 감지 : TCP 송신자는 손실이벤트(Timeout, Duplicate ACK)발생 시 송신률을 낮춤
Slow Start
cwnd < ssthresh 일 때 cwnd는 지수적으로 증가한다.
새로운 TCP 연결 생성이나 Timeout으로 패킷 손실이 발생한 경우 수행한다.
- Timeout : cwnd = 1
- 3 Duplication ACK : ssthresh = 1/2, cwnd = ssthresh로 변경후 Congestion Avoidance 상태로 전이
Congestion Avoidance
지수적 증가가 ssthresh에 도달하면 혼잡으로 간주하고 혼잡을 회피하기 위해 선형적으로 증가한다.
Fast Retransmit과 Fast Recovery
- Fast Retransmit : 세 번의 Duplicate ACK가 발생하면(마지막으로 잘 도착한 패킷의 다음 순번을 ACK패킷에 실어서 보내므로 패킷이 손실되면 중복된 ACK가 도착함) Timeout을 기다리지 않고 즉시 전송 시작
- Fast Recovery : Fast Retransmit 수행 후 Congestion Avoidance 수행(not Slow start)
3-Way Handshake(연결 설정)
https://asfirstalways.tistory.com/356
이는 TCP 연결을 설정하는 방법으로도 볼 수 있다. 이는 신뢰성 있게 데이터 전송을 제어하기 위해 TCP가 수행해야 하는 동작들이다.
- SYN : 첫 단계에서 클라이언트는 서버와 연결을 설정하길 원한다. 그러므로 클라이언트가 통신을 시작하고 싶다는 것을 서버에게 알리는 SYN 세그먼트를 전송하고 세그먼트를 시작하는 시퀀스 번호를 지정한다.
- SYN + ACK : 서버는 SYN + ACK로 클라이언트 요청에 응답한다. ACK는 수신받은 세그먼트에 대한 응답을 나타내고 SYN은 세그먼트를 시작할 수 있는 시퀀스 넘버를 나타낸다.
- ACK : 마지막 부분에서 클라이언트는 서버의 응답을 확인하고 둘 다 실제 데이터 전송을 시작할 신뢰할 수 있는 연결을 설정한다.
+) 1번과 2번은 단방향에 대한 시퀀스 번호를 설정하고 승인된다. 2번과 3번을 통해 다른 방향에 대한 시퀀스 번호를 설정하고 승인된 뒤, 전이중 통신이 설정된다.
+) 이 때 시퀀스 넘버는 랜덤하다.
4-Way Handshake(연결 해제)
- FIN : 클라이언트는 연결을 종료하겠다는 FIN플래그를 전송한다.
- ACK : 서버는 클라이언트의 요청(FIN)을 받고 확인했다는 의미로 ACK를 보낸다.
- 전송 중인 데이터를 모두 보낼 때까지 잠깐 TIME_OUT을 거친다.
- FIN : 데이터를 모두 보내고 통신이 끝났으면 연결이 종료되었음을 알리는 FIN 플래그를 전송한다.
- ACK : 클라이언트는 FIN메시지를 확인했다는 의미로 ACK를 보낸다.
+)서버는 ACK 메시지를 받은 후 소켓 연결을 종료한다.
+)클라이언트는 아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 ACK를 보낸 후 일정 시간 동안 세션을 열어 놓는다(TIME_WAIT)
'CS' 카테고리의 다른 글
[네트워크]HTTP 메소드와 멱등성 (0) | 2021.04.11 |
---|---|
[네트워크]HTTP 헤더 (0) | 2021.04.11 |
[네트워크] TCP와 UDP (0) | 2021.04.11 |
[네트워크] OSI 7계층 (0) | 2021.04.11 |
[네트워크] 웹의 동작 (0) | 2021.04.11 |